1e83b4eb1cf3dd67f3f3700af3e498641268b50c7NAKAMURA Takumi// RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2e83b4eb1cf3dd67f3f3700af3e498641268b50c7NAKAMURA Takumi// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++1z -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 5ed7dc87192784841839908a88b6d0623f6278408Richard Smith 6ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr100 { // dr100: yes 70e2c34f92f00628d48968dfea096d36381f494cbStephen Hines template<const char *> struct A {}; // expected-note 0-1{{declared here}} 80e2c34f92f00628d48968dfea096d36381f494cbStephen Hines template<const char (&)[4]> struct B {}; // expected-note 0-1{{declared here}} 9ed7dc87192784841839908a88b6d0623f6278408Richard Smith A<"foo"> a; // expected-error {{does not refer to any declaration}} 10ed7dc87192784841839908a88b6d0623f6278408Richard Smith B<"bar"> b; // expected-error {{does not refer to any declaration}} 11ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 12ed7dc87192784841839908a88b6d0623f6278408Richard Smith 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr101 { // dr101: 3.5 14662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith extern "C" void dr101_f(); 15ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef unsigned size_t; 16ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace X { 17662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith extern "C" void dr101_f(); 18ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef unsigned size_t; 19ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 20662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith using X::dr101_f; 21ed7dc87192784841839908a88b6d0623f6278408Richard Smith using X::size_t; 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" void dr101_f(); 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef unsigned size_t; 24ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 25ed7dc87192784841839908a88b6d0623f6278408Richard Smith 26ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr102 { // dr102: yes 27ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace A { 28ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> T f(T a, T b) { return a + b; } // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}} 29ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 30ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace B { 31ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct S {}; 32ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 33ed7dc87192784841839908a88b6d0623f6278408Richard Smith B::S operator+(B::S, B::S); // expected-note {{should be declared prior to the call site or in namespace 'dr102::B'}} 34ed7dc87192784841839908a88b6d0623f6278408Richard Smith template B::S A::f(B::S, B::S); // expected-note {{in instantiation of}} 35ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 36ed7dc87192784841839908a88b6d0623f6278408Richard Smith 37ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr103: na 38ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr104 FIXME: add codegen test 39ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr105: na 40ed7dc87192784841839908a88b6d0623f6278408Richard Smith 41ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr106 { // dr106: sup 540 42ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef int &r1; 43ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef r1 &r1; 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef const r1 r1; // expected-warning {{has no effect}} 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef const r1 &r1; // expected-warning {{has no effect}} 46ed7dc87192784841839908a88b6d0623f6278408Richard Smith 47ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef const int &r2; 48ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef r2 &r2; 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef const r2 r2; // expected-warning {{has no effect}} 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef const r2 &r2; // expected-warning {{has no effect}} 51ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 52ed7dc87192784841839908a88b6d0623f6278408Richard Smith 53ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr107 { // dr107: yes 54ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct S {}; 55ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern "C" S operator+(S, S) { return S(); } 56ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 57ed7dc87192784841839908a88b6d0623f6278408Richard Smith 58ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr108 { // dr108: yes 59ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct A { 60ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B { typedef int X; }; 61ed7dc87192784841839908a88b6d0623f6278408Richard Smith B::X x; // expected-error {{missing 'typename'}} 62ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct C : B { X x; }; // expected-error {{unknown type name}} 63ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 64ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<> struct A<int>::B { int X; }; 65ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 66ed7dc87192784841839908a88b6d0623f6278408Richard Smith 67ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr109 { // dr109: yes 68ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { template<typename T> void f(T); }; 69ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct B : T { 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using T::template f; // expected-error {{using declaration cannot refer to a template}} 71ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { this->f<int>(123); } // expected-error {{use 'template'}} 72ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 73ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 74ed7dc87192784841839908a88b6d0623f6278408Richard Smith 75ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr111 { // dr111: dup 535 76ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { A(); A(volatile A&, int = 0); A(A&, const char * = "foo"); }; 77743cbb91499e138a63a398c6515667905f1b3be8Richard Smith struct B : A { B(); }; // expected-note +{{would lose const qualifier}} expected-note {{requires 0 arguments}} 78ed7dc87192784841839908a88b6d0623f6278408Richard Smith const B b1; 79ed7dc87192784841839908a88b6d0623f6278408Richard Smith B b2(b1); // expected-error {{no matching constructor}} 80ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 81ed7dc87192784841839908a88b6d0623f6278408Richard Smith 82ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr112 { // dr112: yes 83ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct T { int n; }; 84ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef T Arr[1]; 85ed7dc87192784841839908a88b6d0623f6278408Richard Smith 86ed7dc87192784841839908a88b6d0623f6278408Richard Smith const T a1[1] = {}; 87ed7dc87192784841839908a88b6d0623f6278408Richard Smith volatile T a2[1] = {}; 88ed7dc87192784841839908a88b6d0623f6278408Richard Smith const Arr a3 = {}; 89ed7dc87192784841839908a88b6d0623f6278408Richard Smith volatile Arr a4 = {}; 90ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<const volatile T*> struct X {}; 91ed7dc87192784841839908a88b6d0623f6278408Richard Smith X<a1> x1; 92ed7dc87192784841839908a88b6d0623f6278408Richard Smith X<a2> x2; 93ed7dc87192784841839908a88b6d0623f6278408Richard Smith X<a3> x3; 94ed7dc87192784841839908a88b6d0623f6278408Richard Smith X<a4> x4; 95ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L 96ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-error@-5 {{internal linkage}} expected-note@-10 {{here}} 97ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-error@-4 {{internal linkage}} expected-note@-9 {{here}} 98ed7dc87192784841839908a88b6d0623f6278408Richard Smith#else 99ed7dc87192784841839908a88b6d0623f6278408Richard Smith // FIXME: Test this somehow. 100ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 101ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 102ed7dc87192784841839908a88b6d0623f6278408Richard Smith 103ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr113 { // dr113: yes 104ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern void (*p)(); 105ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f() { 106ed7dc87192784841839908a88b6d0623f6278408Richard Smith no_such_function(); // expected-error {{undeclared}} 107ed7dc87192784841839908a88b6d0623f6278408Richard Smith p(); 108ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 109ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(); 110ed7dc87192784841839908a88b6d0623f6278408Richard Smith void (*p)() = &g; 111ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 112ed7dc87192784841839908a88b6d0623f6278408Richard Smith 113ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr114 { // dr114: yes 114ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 115ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void f(int) = 0; // expected-note {{unimplemented}} 116ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 117ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : A { 118ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(T); 119ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { f(0); } 120ed7dc87192784841839908a88b6d0623f6278408Richard Smith } b; // expected-error {{abstract}} 121ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 122ed7dc87192784841839908a88b6d0623f6278408Richard Smith 123ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr115 { // dr115: yes 124ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int f(T); // expected-note +{{}} 125ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int g(T); // expected-note +{{}} 126ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int g(T, int); // expected-note +{{}} 127ed7dc87192784841839908a88b6d0623f6278408Richard Smith 128ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k1 = f(&f); // expected-error {{no match}} 129ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k2 = f(&f<int>); 130ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k3 = f(&g<int>); // expected-error {{no match}} 131ed7dc87192784841839908a88b6d0623f6278408Richard Smith 132ed7dc87192784841839908a88b6d0623f6278408Richard Smith void h() { 133ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&f; // expected-error {{address of overloaded function 'f' cannot be cast to type 'void'}} 134ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&f<int>; 135ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&g<int>; // expected-error {{address of overloaded function 'g' cannot be cast to type 'void'}} 136ed7dc87192784841839908a88b6d0623f6278408Richard Smith 137ed7dc87192784841839908a88b6d0623f6278408Richard Smith &f; // expected-error {{reference to overloaded function could not be resolved}} 138ed7dc87192784841839908a88b6d0623f6278408Richard Smith &f<int>; // expected-warning {{unused}} 139ed7dc87192784841839908a88b6d0623f6278408Richard Smith &g<int>; // expected-error {{reference to overloaded function could not be resolved}} 140ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 141ed7dc87192784841839908a88b6d0623f6278408Richard Smith 142ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct S { 143ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> static int f(T); 144ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> static int g(T); 145ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> static int g(T, int); 146ed7dc87192784841839908a88b6d0623f6278408Richard Smith } s; 147ed7dc87192784841839908a88b6d0623f6278408Richard Smith 148ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k4 = f(&s.f); // expected-error {{non-constant pointer to member}} 149ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k5 = f(&s.f<int>); 150ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k6 = f(&s.g<int>); // expected-error {{non-constant pointer to member}} 151ed7dc87192784841839908a88b6d0623f6278408Richard Smith 152ed7dc87192784841839908a88b6d0623f6278408Richard Smith void i() { 153ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.f; // expected-error {{non-constant pointer to member}} 154ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.f<int>; 155ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.g<int>; // expected-error {{non-constant pointer to member}} 156ed7dc87192784841839908a88b6d0623f6278408Richard Smith 157ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.f; // expected-error {{non-constant pointer to member}} 158ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.f<int>; // expected-warning {{unused}} 159ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.g<int>; // expected-error {{non-constant pointer to member}} 160ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 161ed7dc87192784841839908a88b6d0623f6278408Richard Smith 162ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct T { 163ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int f(T); 164ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int g(T); 165ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> int g(T, int); 166ed7dc87192784841839908a88b6d0623f6278408Richard Smith } t; 167ed7dc87192784841839908a88b6d0623f6278408Richard Smith 168ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k7 = f(&s.f); // expected-error {{non-constant pointer to member}} 169ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k8 = f(&s.f<int>); 170ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k9 = f(&s.g<int>); // expected-error {{non-constant pointer to member}} 171ed7dc87192784841839908a88b6d0623f6278408Richard Smith 172ed7dc87192784841839908a88b6d0623f6278408Richard Smith void j() { 173ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.f; // expected-error {{non-constant pointer to member}} 174ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.f<int>; 175ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&s.g<int>; // expected-error {{non-constant pointer to member}} 176ed7dc87192784841839908a88b6d0623f6278408Richard Smith 177ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.f; // expected-error {{non-constant pointer to member}} 178ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.f<int>; // expected-warning {{unused}} 179ed7dc87192784841839908a88b6d0623f6278408Richard Smith &s.g<int>; // expected-error {{non-constant pointer to member}} 180ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 181ed7dc87192784841839908a88b6d0623f6278408Richard Smith 182ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L 183ed7dc87192784841839908a88b6d0623f6278408Richard Smith // Special case kicks in only if a template argument list is specified. 184ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T=int> void with_default(); // expected-note +{{}} 185ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k10 = f(&with_default); // expected-error {{no matching function}} 186ed7dc87192784841839908a88b6d0623f6278408Richard Smith int k11 = f(&with_default<>); 187ed7dc87192784841839908a88b6d0623f6278408Richard Smith void k() { 188ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&with_default; // expected-error {{overloaded function}} 189ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)&with_default<>; 190ed7dc87192784841839908a88b6d0623f6278408Richard Smith &with_default; // expected-error {{overloaded function}} 191ed7dc87192784841839908a88b6d0623f6278408Richard Smith &with_default<>; // expected-warning {{unused}} 192ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 193ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 194ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 195ed7dc87192784841839908a88b6d0623f6278408Richard Smith 196ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr116 { // dr116: yes 197ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<int> struct A {}; 198ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<int N> void f(A<N>) {} // expected-note {{previous}} 199ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<int M> void f(A<M>) {} // expected-error {{redefinition}} 200ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(A<sizeof(T)>) {} // expected-note {{previous}} 201ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename U> void f(A<sizeof(U)>) {} // expected-error {{redefinition}} 202ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 203ed7dc87192784841839908a88b6d0623f6278408Richard Smith 204ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr117: na 205ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr118 FIXME: add codegen test 206ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr119: na 207ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr120: na 208ed7dc87192784841839908a88b6d0623f6278408Richard Smith 209ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr121 { // dr121: yes 210ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct X { 211ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct Y {}; 212ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 213ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct Z { 214ed7dc87192784841839908a88b6d0623f6278408Richard Smith X::Y<T> x; 215ed7dc87192784841839908a88b6d0623f6278408Richard Smith T::Y<T> y; // expected-error +{{}} 216ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 217ed7dc87192784841839908a88b6d0623f6278408Richard Smith Z<X> z; 218ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 219ed7dc87192784841839908a88b6d0623f6278408Richard Smith 220ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr122 { // dr122: yes 221ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(); 222ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { f<int>(); } 223ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 224ed7dc87192784841839908a88b6d0623f6278408Richard Smith 225ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr123: na 226ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr124: dup 201 227ed7dc87192784841839908a88b6d0623f6278408Richard Smith 228ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr125: yes 229b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smithstruct dr125_A { struct dr125_B {}; }; // expected-note {{here}} 230ed7dc87192784841839908a88b6d0623f6278408Richard Smithdr125_A::dr125_B dr125_C(); 231ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr125_B { dr125_A dr125_C(); } 232ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr125 { 233ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct X { 234ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend dr125_A::dr125_B (::dr125_C)(); // ok 235ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend dr125_A (::dr125_B::dr125_C)(); // ok 236b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smith friend dr125_A::dr125_B::dr125_C(); // expected-error {{did you mean the constructor name 'dr125_B'?}} 237a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar // expected-error@-1 {{missing exception specification}} 238b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smith#if __cplusplus >= 201103L 239b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smith // expected-error@-3 {{follows constexpr declaration}} expected-note@-10 {{here}} 240b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smith#endif 241ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 242ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 243ed7dc87192784841839908a88b6d0623f6278408Richard Smith 244ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr126 { // dr126: no 245ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct C {}; 246ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct D : C {}; 247ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct E : private C { friend class A; friend class B; }; 248ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct F : protected C {}; 249ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct G : C {}; 250ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct H : D, G {}; 251ed7dc87192784841839908a88b6d0623f6278408Richard Smith 252ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 253ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void cp() throw(C*); 254ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void dp() throw(C*); 255ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ep() throw(C*); // expected-note {{overridden}} 256ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void fp() throw(C*); // expected-note {{overridden}} 257ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void gp() throw(C*); 258ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void hp() throw(C*); // expected-note {{overridden}} 259ed7dc87192784841839908a88b6d0623f6278408Richard Smith 260ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void cr() throw(C&); 261ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void dr() throw(C&); 262ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void er() throw(C&); // expected-note {{overridden}} 263ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void fr() throw(C&); // expected-note {{overridden}} 264ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void gr() throw(C&); 265ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void hr() throw(C&); // expected-note {{overridden}} 266ed7dc87192784841839908a88b6d0623f6278408Richard Smith 267ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void pv() throw(void*); // expected-note {{overridden}} 268ed7dc87192784841839908a88b6d0623f6278408Richard Smith 269ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L 270ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void np() throw(C*); // expected-note {{overridden}} 271ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void npm() throw(int C::*); // expected-note {{overridden}} 272ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void nr() throw(C&); // expected-note {{overridden}} 273ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 274ed7dc87192784841839908a88b6d0623f6278408Richard Smith 275ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ref1() throw(C *const&); 276ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ref2() throw(C *); 277ed7dc87192784841839908a88b6d0623f6278408Richard Smith 278ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void v() throw(int); 279ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void w() throw(const int); 280ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void x() throw(int*); 281ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void y() throw(const int*); 282ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void z() throw(int); // expected-note {{overridden}} 283ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 284ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : A { 285ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void cp() throw(C*); 286ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void dp() throw(D*); 287ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ep() throw(E*); // expected-error {{more lax}} 288ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void fp() throw(F*); // expected-error {{more lax}} 289ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void gp() throw(G*); 290ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void hp() throw(H*); // expected-error {{more lax}} 291ed7dc87192784841839908a88b6d0623f6278408Richard Smith 292ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void cr() throw(C&); 293ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void dr() throw(D&); 294ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void er() throw(E&); // expected-error {{more lax}} 295ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void fr() throw(F&); // expected-error {{more lax}} 296ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void gr() throw(G&); 297ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void hr() throw(H&); // expected-error {{more lax}} 298ed7dc87192784841839908a88b6d0623f6278408Richard Smith 299ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void pv() throw(C*); // expected-error {{more lax}} FIXME: This is valid. 300ed7dc87192784841839908a88b6d0623f6278408Richard Smith 301ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L 302ed7dc87192784841839908a88b6d0623f6278408Richard Smith using nullptr_t = decltype(nullptr); 303ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void np() throw(nullptr_t*); // expected-error {{more lax}} FIXME: This is valid. 304ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void npm() throw(nullptr_t*); // expected-error {{more lax}} FIXME: This is valid. 305ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void nr() throw(nullptr_t&); // expected-error {{more lax}} This is not. 306ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 307ed7dc87192784841839908a88b6d0623f6278408Richard Smith 308ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ref1() throw(D *const &); 309ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void ref2() throw(D *); 310ed7dc87192784841839908a88b6d0623f6278408Richard Smith 311ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void v() throw(const int); 312ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void w() throw(int); 313ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void x() throw(const int*); // FIXME: 'const int*' is not allowed by A::h. 314ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void y() throw(int*); // ok 315ed7dc87192784841839908a88b6d0623f6278408Richard Smith virtual void z() throw(long); // expected-error {{more lax}} 316ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 317ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 318ed7dc87192784841839908a88b6d0623f6278408Richard Smith 319ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr127 { // dr127: yes 3205c8a92ef245c773fa56e66a8c88ae9393eea2fb6Richard Smith __extension__ typedef __decltype(sizeof(0)) size_t; 321ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct A { 322ed7dc87192784841839908a88b6d0623f6278408Richard Smith A() throw(int); 323ed7dc87192784841839908a88b6d0623f6278408Richard Smith void *operator new(size_t, const char * = 0); 324ed7dc87192784841839908a88b6d0623f6278408Richard Smith void operator delete(void *, const char *) { T::error; } // expected-error 2{{no members}} 325ed7dc87192784841839908a88b6d0623f6278408Richard Smith void operator delete(void *) { T::error; } 326ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 327ed7dc87192784841839908a88b6d0623f6278408Richard Smith A<void> *p = new A<void>; // expected-note {{instantiat}} 328ed7dc87192784841839908a88b6d0623f6278408Richard Smith A<int> *q = new ("") A<int>; // expected-note {{instantiat}} 329ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 330ed7dc87192784841839908a88b6d0623f6278408Richard Smith 331ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr128 { // dr128: yes 332ed7dc87192784841839908a88b6d0623f6278408Richard Smith enum E1 { e1 } x = e1; 333ed7dc87192784841839908a88b6d0623f6278408Richard Smith enum E2 { e2 } y = static_cast<E2>(x), z = static_cast<E2>(e1); 334ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 335ed7dc87192784841839908a88b6d0623f6278408Richard Smith 336ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr129: dup 616 337ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr130: na 338ed7dc87192784841839908a88b6d0623f6278408Richard Smith 339ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr131 { // dr131: yes 340ed7dc87192784841839908a88b6d0623f6278408Richard Smith const char *a_with_\u0e8c = "\u0e8c"; 341ed7dc87192784841839908a88b6d0623f6278408Richard Smith const char *b_with_\u0e8d = "\u0e8d"; 342ed7dc87192784841839908a88b6d0623f6278408Richard Smith const char *c_with_\u0e8e = "\u0e8e"; 343ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L 344ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-error@-4 {{expected ';'}} expected-error@-2 {{expected ';'}} 345ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 346ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 347ed7dc87192784841839908a88b6d0623f6278408Richard Smith 348ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr132 { // dr132: no 349ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f() { 350ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern struct {} x; // ok 351ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern struct S {} y; // FIXME: This is invalid. 352ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 353ed7dc87192784841839908a88b6d0623f6278408Richard Smith static enum { E } e; 354ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 355ed7dc87192784841839908a88b6d0623f6278408Richard Smith 356ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr133: dup 87 357ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr134: na 358ed7dc87192784841839908a88b6d0623f6278408Richard Smith 359ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr135 { // dr135: yes 360ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 361ed7dc87192784841839908a88b6d0623f6278408Richard Smith A f(A a) { return a; } 362ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend A g(A a) { return a; } 363ed7dc87192784841839908a88b6d0623f6278408Richard Smith static A h(A a) { return a; } 364ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 365ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 366ed7dc87192784841839908a88b6d0623f6278408Richard Smith 367f6a144f5991c6b29622a31fdab86adede0648d12David Majnemernamespace dr136 { // dr136: 3.4 368f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer void f(int, int, int = 0); // expected-note {{previous declaration is here}} 369f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer void g(int, int, int); // expected-note {{previous declaration is here}} 370ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 371f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer friend void f(int, int = 0, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}} 372f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer friend void g(int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}} 373f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer friend void h(int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be a definition}} 374f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer friend void i(int, int, int = 0) {} // expected-note {{previous declaration is here}} 375ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void j(int, int, int = 0) {} 376ed7dc87192784841839908a88b6d0623f6278408Richard Smith operator int(); 377ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 378f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer void i(int, int, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}} 379ed7dc87192784841839908a88b6d0623f6278408Richard Smith void q() { 380ed7dc87192784841839908a88b6d0623f6278408Richard Smith j(A(), A()); // ok, has default argument 381ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 382f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer extern "C" void k(int, int, int, int); // expected-note {{previous declaration is here}} 383f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer namespace NSA { 384f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer struct A { 385f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer friend void dr136::k(int, int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}} \ 386f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer // expected-note {{previous declaration is here}} 387f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer }; 388f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer } 389f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer namespace NSB { 390f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer struct A { 391f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer friend void dr136::k(int, int, int = 0, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}} 392f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer }; 393f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer } 394f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer struct B { 395f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer void f(int); // expected-note {{previous declaration is here}} 396f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer }; 397f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer struct C { 398f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer friend void B::f(int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}} 399f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer }; 400ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 401ed7dc87192784841839908a88b6d0623f6278408Richard Smith 402ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr137 { // dr137: yes 403ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern void *p; 404ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern const void *cp; 405ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern volatile void *vp; 406ed7dc87192784841839908a88b6d0623f6278408Richard Smith extern const volatile void *cvp; 407ed7dc87192784841839908a88b6d0623f6278408Richard Smith int *q = static_cast<int*>(p); 408ed7dc87192784841839908a88b6d0623f6278408Richard Smith int *qc = static_cast<int*>(cp); // expected-error {{casts away qualifiers}} 409ed7dc87192784841839908a88b6d0623f6278408Richard Smith int *qv = static_cast<int*>(vp); // expected-error {{casts away qualifiers}} 410ed7dc87192784841839908a88b6d0623f6278408Richard Smith int *qcv = static_cast<int*>(cvp); // expected-error {{casts away qualifiers}} 411ed7dc87192784841839908a88b6d0623f6278408Richard Smith const int *cq = static_cast<const int*>(p); 412ed7dc87192784841839908a88b6d0623f6278408Richard Smith const int *cqc = static_cast<const int*>(cp); 413ed7dc87192784841839908a88b6d0623f6278408Richard Smith const int *cqv = static_cast<const int*>(vp); // expected-error {{casts away qualifiers}} 414ed7dc87192784841839908a88b6d0623f6278408Richard Smith const int *cqcv = static_cast<const int*>(cvp); // expected-error {{casts away qualifiers}} 415ed7dc87192784841839908a88b6d0623f6278408Richard Smith const volatile int *cvq = static_cast<const volatile int*>(p); 416ed7dc87192784841839908a88b6d0623f6278408Richard Smith const volatile int *cvqc = static_cast<const volatile int*>(cp); 417ed7dc87192784841839908a88b6d0623f6278408Richard Smith const volatile int *cvqv = static_cast<const volatile int*>(vp); 418ed7dc87192784841839908a88b6d0623f6278408Richard Smith const volatile int *cvqcv = static_cast<const volatile int*>(cvp); 419ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 420ed7dc87192784841839908a88b6d0623f6278408Richard Smith 421ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr139 { // dr139: yes 422ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example1 { 423ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef int f; // expected-note {{previous}} 424ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 425ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void f(A &); // expected-error {{different kind of symbol}} 426ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 427ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 428ed7dc87192784841839908a88b6d0623f6278408Richard Smith 429ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example2 { 430ed7dc87192784841839908a88b6d0623f6278408Richard Smith typedef int f; 431ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace N { 432ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { 433ed7dc87192784841839908a88b6d0623f6278408Richard Smith friend void f(A &); 434ed7dc87192784841839908a88b6d0623f6278408Richard Smith operator int(); 435ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(A a) { int i = f(a); } // ok, f is typedef not friend function 436ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 437ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 438ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 439ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 440ed7dc87192784841839908a88b6d0623f6278408Richard Smith 441ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr140 { // dr140: yes 442ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(int *const) {} // expected-note {{previous}} 443ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(int[3]) {} // expected-error {{redefinition}} 444ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(const int); 445ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(int n) { n = 2; } 446ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 447ed7dc87192784841839908a88b6d0623f6278408Richard Smith 448ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr141 { // dr141: yes 449ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(); 450ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct S { int n; }; 451ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A : S<int> { 452ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void f(); 453ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct S {}; 454ed7dc87192784841839908a88b6d0623f6278408Richard Smith } a; 455ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : S<int> {} b; 456ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { 457ed7dc87192784841839908a88b6d0623f6278408Richard Smith a.f<int>(); 458ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)a.S<int>::n; // expected-error {{no member named 'n'}} 459ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L 460ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-error@-2 {{ambiguous}} 461ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-note@-11 {{lookup from the current scope}} 462ed7dc87192784841839908a88b6d0623f6278408Richard Smith // expected-note@-9 {{lookup in the object type}} 463ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif 464ed7dc87192784841839908a88b6d0623f6278408Richard Smith b.f<int>(); // expected-error {{no member}} expected-error +{{}} 465ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)b.S<int>::n; 466ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 467ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> struct C { 468ed7dc87192784841839908a88b6d0623f6278408Richard Smith T t; 469ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g() { 470ed7dc87192784841839908a88b6d0623f6278408Richard Smith t.f<int>(); // expected-error {{use 'template'}} 471ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 472ed7dc87192784841839908a88b6d0623f6278408Richard Smith void h() { 473ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)t.S<int>::n; // ok 474ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 475ed7dc87192784841839908a88b6d0623f6278408Richard Smith void i() { 476ed7dc87192784841839908a88b6d0623f6278408Richard Smith (void)t.S<int>(); // ok! 477ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 478ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 479ed7dc87192784841839908a88b6d0623f6278408Richard Smith void h() { C<B>().h(); } // ok 480ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct X { 481ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> void S(); 482ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 483ed7dc87192784841839908a88b6d0623f6278408Richard Smith void i() { C<X>().i(); } // ok!! 484ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 485ed7dc87192784841839908a88b6d0623f6278408Richard Smith 486ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr142 { // dr142: yes 487ed7dc87192784841839908a88b6d0623f6278408Richard Smith class B { // expected-note +{{here}} 488ed7dc87192784841839908a88b6d0623f6278408Richard Smith public: 489ed7dc87192784841839908a88b6d0623f6278408Richard Smith int mi; // expected-note +{{here}} 490ed7dc87192784841839908a88b6d0623f6278408Richard Smith static int si; // expected-note +{{here}} 491ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 492ed7dc87192784841839908a88b6d0623f6278408Richard Smith class D : private B { // expected-note +{{here}} 493ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 494ed7dc87192784841839908a88b6d0623f6278408Richard Smith class DD : public D { 495ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(); 496ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 497ed7dc87192784841839908a88b6d0623f6278408Richard Smith void DD::f() { 498ed7dc87192784841839908a88b6d0623f6278408Richard Smith mi = 3; // expected-error {{private base class}} expected-error {{private member}} 499ed7dc87192784841839908a88b6d0623f6278408Richard Smith si = 3; // expected-error {{private member}} 500ed7dc87192784841839908a88b6d0623f6278408Richard Smith B b_old; // expected-error {{private member}} 501ed7dc87192784841839908a88b6d0623f6278408Richard Smith dr142::B b; 502ed7dc87192784841839908a88b6d0623f6278408Richard Smith b.mi = 3; 503ed7dc87192784841839908a88b6d0623f6278408Richard Smith b.si = 3; 504ed7dc87192784841839908a88b6d0623f6278408Richard Smith B::si = 3; // expected-error {{private member}} 505ed7dc87192784841839908a88b6d0623f6278408Richard Smith dr142::B::si = 3; 506ed7dc87192784841839908a88b6d0623f6278408Richard Smith B *bp1_old = this; // expected-error {{private member}} expected-error {{private base class}} 507ed7dc87192784841839908a88b6d0623f6278408Richard Smith dr142::B *bp1 = this; // expected-error {{private base class}} 508ed7dc87192784841839908a88b6d0623f6278408Richard Smith B *bp2_old = (B*)this; // expected-error 2{{private member}} 509ed7dc87192784841839908a88b6d0623f6278408Richard Smith dr142::B *bp2 = (dr142::B*)this; 510ed7dc87192784841839908a88b6d0623f6278408Richard Smith bp2->mi = 3; 511ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 512ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 513ed7dc87192784841839908a88b6d0623f6278408Richard Smith 514ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr143 { // dr143: yes 515ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace A { struct X; } 516ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace B { void f(A::X); } 517ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace A { 518ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct X { friend void B::f(X); }; 519ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 520ed7dc87192784841839908a88b6d0623f6278408Richard Smith void g(A::X x) { 521ed7dc87192784841839908a88b6d0623f6278408Richard Smith f(x); // expected-error {{undeclared identifier 'f'}} 522ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 523ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 524ed7dc87192784841839908a88b6d0623f6278408Richard Smith 525ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr145 { // dr145: yes 526ed7dc87192784841839908a88b6d0623f6278408Richard Smith void f(bool b) { 527a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#if __cplusplus <= 201402L 528ed7dc87192784841839908a88b6d0623f6278408Richard Smith ++b; // expected-warning {{deprecated}} 529ed7dc87192784841839908a88b6d0623f6278408Richard Smith b++; // expected-warning {{deprecated}} 530a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#else 531a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar ++b; // expected-error {{increment}} 532a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar b++; // expected-error {{increment}} 533a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#endif 534ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 535ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 536ed7dc87192784841839908a88b6d0623f6278408Richard Smith 537ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr147 { // dr147: no 538ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example1 { 539ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename> struct A { 540ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> A(T); 541ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 542ed7dc87192784841839908a88b6d0623f6278408Richard Smith // FIXME: This appears to be valid, and EDG and G++ accept. 543ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<> template<> A<int>::A<int>(int) {} // expected-error {{out-of-line constructor for 'A' cannot have template arguments}} 544ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 545ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example2 { 546ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { A(); }; 547ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct B : A { B(); }; 548ed7dc87192784841839908a88b6d0623f6278408Richard Smith A::A a1; // expected-error {{is a constructor}} 549ed7dc87192784841839908a88b6d0623f6278408Richard Smith B::A a2; 550ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 551ed7dc87192784841839908a88b6d0623f6278408Richard Smith namespace example3 { 552ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename> struct A { 553ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<typename T> A(T); 554ed7dc87192784841839908a88b6d0623f6278408Richard Smith static A a; 555ed7dc87192784841839908a88b6d0623f6278408Richard Smith }; 556ed7dc87192784841839908a88b6d0623f6278408Richard Smith template<> A<int>::A<int>(A<int>::a); // expected-error {{is a constructor}} 557ed7dc87192784841839908a88b6d0623f6278408Richard Smith } 558ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 559ed7dc87192784841839908a88b6d0623f6278408Richard Smith 560ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr148 { // dr148: yes 561ed7dc87192784841839908a88b6d0623f6278408Richard Smith struct A { int A::*p; }; 562ed7dc87192784841839908a88b6d0623f6278408Richard Smith int check1[__is_pod(int(A::*)) ? 1 : -1]; 563ed7dc87192784841839908a88b6d0623f6278408Richard Smith int check2[__is_pod(A) ? 1 : -1]; 564ed7dc87192784841839908a88b6d0623f6278408Richard Smith} 565ed7dc87192784841839908a88b6d0623f6278408Richard Smith 566ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr149: na 567cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 568cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr151 { // dr151: yes 569cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct X {}; 570cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith typedef int X::*p; 571cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#if __cplusplus < 201103L 572cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#define fold(x) (__builtin_constant_p(0) ? (x) : (x)) 573cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#else 574cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#define fold 575cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#endif 576cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith int check[fold(p() == 0) ? 1 : -1]; 577cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#undef fold 578cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 579cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 580cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr152 { // dr152: yes 581cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct A { 582cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith A(); // expected-note {{not viable}} 583cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith explicit A(const A&); 584cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith }; 585cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith A a1 = A(); // expected-error {{no matching constructor}} 586cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith A a2((A())); 587cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 588cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 589cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith// dr153: na 590cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 591cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr154 { // dr154: yes 592cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith union { int a; }; // expected-error {{must be declared 'static'}} 593cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith namespace { 594cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith union { int b; }; 595cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith } 596cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith static union { int c; }; 597cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 598cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 599cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr155 { // dr155: dup 632 600cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct S { int n; } s = { { 1 } }; // expected-warning {{braces around scalar initializer}} 601cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 602cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr158 FIXME write codegen test 604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr159 { // dr159: 3.5 606cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith namespace X { void f(); } 607cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith void f(); 608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void dr159::f() {} // expected-warning {{extra qualification}} 609cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith void dr159::X::f() {} 610cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 611cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 612cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith// dr160: na 613cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 614cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr161 { // dr161: yes 615cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith class A { 616cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith protected: 617cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct B { int n; } b; // expected-note 2{{here}} 618cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith static B bs; 619cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith void f(); // expected-note {{here}} 620cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith static void sf(); 621cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith }; 622cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct C : A {}; 623cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct D : A { 624cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith void g(C c) { 625cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith (void)b.n; 626cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith B b1; 627cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith C::B b2; // ok, accessible as a member of A 628cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith (void)&C::b; // expected-error {{protected}} 629cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith (void)&C::bs; 630cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith (void)c.b; // expected-error {{protected}} 631cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith (void)c.bs; 632cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith f(); 633cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith sf(); 634cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith c.f(); // expected-error {{protected}} 635cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith c.sf(); 636cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith A::f(); 637cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith D::f(); 638cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith A::sf(); 639cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith C::sf(); 640cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith D::sf(); 641cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith } 642cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith }; 643cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 644cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 645cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr162 { // dr162: no 646cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct A { 647cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith char &f(char); 648cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith static int &f(int); 649cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 650cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith void g() { 651cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith int &a = (&A::f)(0); // FIXME: expected-error {{could not be resolved}} 652cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith char &b = (&A::f)('0'); // expected-error {{could not be resolved}} 653cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith } 654cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith }; 655cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 656cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith int &c = (&A::f)(0); // FIXME: expected-error {{could not be resolved}} 657cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith char &d = (&A::f)('0'); // expected-error {{could not be resolved}} 658cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 659cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 660cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith// dr163: na 661cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 662cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr164 { // dr164: yes 663cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith void f(int); 664cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith template <class T> int g(T t) { return f(t); } 665cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 666cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith enum E { e }; 667cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith int f(E); 668cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 669cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith int k = g(e); 670cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 671cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith 672cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr165 { // dr165: no 673cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith namespace N { 674cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct A { friend struct B; }; 675cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith void f() { void g(); } 676cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith } 677cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith // FIXME: dr1477 says this is ok, dr165 says it's ill-formed 678cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith struct N::B {}; 679cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith // FIXME: dr165 says this is ill-formed, but the argument in dr1477 says it's ok 680cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith void N::g() {} 681cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith} 682fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith 683fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smithnamespace dr166 { // dr166: yes 684fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith namespace A { class X; } 685fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith 686fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith template<typename T> int f(T t) { return t.n; } 687fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith int g(A::X); 688fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith template<typename T> int h(T t) { return t.n; } // expected-error {{private}} 689fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith int i(A::X); 690fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith 691fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith namespace A { 692fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith class X { 693fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith friend int f<X>(X); 694fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith friend int dr166::g(X); 695fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith friend int h(X); 696fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith friend int i(X); 697fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith int n; // expected-note 2{{here}} 698fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith }; 699fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith 700fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith int h(X x) { return x.n; } 701fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith int i(X x) { return x.n; } 702fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith } 703fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith 704fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith template int f(A::X); 705fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith int g(A::X x) { return x.n; } 706fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith template int h(A::X); // expected-note {{instantiation}} 707fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith int i(A::X x) { return x.n; } // expected-error {{private}} 708fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith} 709fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith 710fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith// dr167: sup 1012 711fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith 712fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smithnamespace dr168 { // dr168: no 713fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith extern "C" typedef int (*p)(); 714fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith extern "C++" typedef int (*q)(); 715fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith struct S { 716fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith static int f(); 717fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith }; 718fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith p a = &S::f; // FIXME: this should fail. 719fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith q b = &S::f; 720fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith} 721fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith 722fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smithnamespace dr169 { // dr169: yes 723fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith template<typename> struct A { int n; }; 724fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith struct B { 725fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith template<typename> struct C; 726fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith template<typename> void f(); 727fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith template<typename> static int n; // expected-error 0-1{{extension}} 728fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith }; 729fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith struct D : A<int>, B { 730fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith using A<int>::n; 731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using B::C<int>; // expected-error {{using declaration cannot refer to a template specialization}} 732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using B::f<int>; // expected-error {{using declaration cannot refer to a template specialization}} 733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using B::n<int>; // expected-error {{using declaration cannot refer to a template specialization}} 734fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith }; 735fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith} 736e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 737e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace { // dr171: yes 738e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int dr171a; 739e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 740e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithint dr171b; // expected-note {{here}} 741e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr171 { 742e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith extern "C" void dr171a(); 743e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith extern "C" void dr171b(); // expected-error {{conflicts}} 744e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 745e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 746e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr172 { // dr172: yes 747e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum { zero }; 748e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check1[-1 < zero ? 1 : -1]; 749e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 750e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum { x = -1, y = (unsigned int)-1 }; 751e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check2[sizeof(x) > sizeof(int) ? 1 : -1]; 752e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 753e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum { a = (unsigned int)-1 / 2 }; 754e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check3a[sizeof(a) == sizeof(int) ? 1 : -1]; 755e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check3b[-a < 0 ? 1 : -1]; 756e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 757e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum { b = (unsigned int)-1 / 2 + 1 }; 758e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check4a[sizeof(b) == sizeof(unsigned int) ? 1 : -1]; 759e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check4b[-b > 0 ? 1 : -1]; 760e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 761e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum { c = (unsigned long)-1 / 2 }; 762e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check5a[sizeof(c) == sizeof(long) ? 1 : -1]; 763e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check5b[-c < 0 ? 1 : -1]; 764e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 765e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum { d = (unsigned long)-1 / 2 + 1 }; 766e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check6a[sizeof(d) == sizeof(unsigned long) ? 1 : -1]; 767e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check6b[-d > 0 ? 1 : -1]; 768e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 769e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum { e = (unsigned long long)-1 / 2 }; // expected-error 0-1{{extension}} 770e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check7a[sizeof(e) == sizeof(long) ? 1 : -1]; // expected-error 0-1{{extension}} 771e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check7b[-e < 0 ? 1 : -1]; 772e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 773e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum { f = (unsigned long long)-1 / 2 + 1 }; // expected-error 0-1{{extension}} 774e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check8a[sizeof(f) == sizeof(unsigned long) ? 1 : -1]; // expected-error 0-1{{extension}} 775e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check8b[-f > 0 ? 1 : -1]; 776e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 777e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 778e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr173 { // dr173: yes 779e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check[('0' + 1 == '1' && '0' + 2 == '2' && '0' + 3 == '3' && 780e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith '0' + 4 == '4' && '0' + 5 == '5' && '0' + 6 == '6' && 781e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith '0' + 7 == '7' && '0' + 8 == '8' && '0' + 9 == '9') ? 1 : -1]; 782e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 783e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 784e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr174: sup 1012 785e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 786e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr175 { // dr175: yes 787e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct A {}; // expected-note {{here}} 788e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct B : private A {}; // expected-note {{constrained by private inheritance}} 789e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct C : B { 790e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith A a; // expected-error {{private}} 791e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith dr175::A b; 792e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 793e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 794e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 795e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr176 { // dr176: yes 796e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T> class Y; 797e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<> class Y<int> { 798e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f() { 799e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef Y A; // expected-note {{here}} 800e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef Y<char> A; // expected-error {{different types ('Y<char>' vs 'Y<int>')}} 801e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 802e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 803e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 804e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T> struct Base {}; // expected-note 2{{found}} 805e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T> struct Derived : public Base<T> { 806e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f() { 807e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef typename Derived::template Base<T> A; 808e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef typename Derived::Base A; 809e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 810e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 811e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template struct Derived<int>; 812e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 813e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T> struct Derived2 : Base<int>, Base<char> { 814e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typename Derived2::Base b; // expected-error {{found in multiple base classes}} 815e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typename Derived2::Base<double> d; 816e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 817e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 818e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T> class X { // expected-note {{here}} 819e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith X *p1; 820e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith X<T> *p2; 821e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith X<int> *p3; 822e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith dr176::X *p4; // expected-error {{requires template arguments}} 823e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 824e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 825e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 826e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr177 { // dr177: yes 827e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct B {}; 828e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct A { 829e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith A(A &); // expected-note {{not viable: expects an l-value}} 830e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith A(const B &); 831e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 832e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith B b; 833e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith A a = b; // expected-error {{no viable constructor copying variable}} 834e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 835e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 836e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr178 { // dr178: yes 837e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check[int() == 0 ? 1 : -1]; 838e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#if __cplusplus >= 201103L 839e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith static_assert(int{} == 0, ""); 840e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct S { int a, b; }; 841e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith static_assert(S{1}.b == 0, ""); 842e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct T { constexpr T() : n() {} int n; }; 843e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith static_assert(T().n == 0, ""); 844e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct U : S { constexpr U() : S() {} }; 845e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith static_assert(U().b == 0, ""); 846e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#endif 847e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 848e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 849e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr179 { // dr179: yes 850e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f(); 851e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int n = &f - &f; // expected-error {{arithmetic on pointers to the function type 'void ()'}} 852e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 853e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 854e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr180 { // dr180: yes 855e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T> struct X : T, T::some_base { 856e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith X() : T::some_type_that_might_be_T(), T::some_base() {} 857e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith friend class T::some_class; 858e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f() { 859e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum T::some_enum e; 860e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 861e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 862e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 863e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 864e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr181 { // dr181: yes 865e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith namespace X { 866e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <template X<class T> > struct A { }; // expected-error +{{}} 867e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <template X<class T> > void f(A<X>) { } // expected-error +{{}} 868e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 869e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 870e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith namespace Y { 871e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <template <class T> class X> struct A { }; 872e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <template <class T> class X> void f(A<X>) { } 873e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 874e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 875e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 876e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr182 { // dr182: yes 877e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <class T> struct C { 878e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f(); 879e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void g(); 880e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 881e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 882e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <class T> void C<T>::f() {} 883e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <class T> void C<T>::g() {} 884e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 885e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith class A { 886e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith class B {}; // expected-note {{here}} 887e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f(); 888e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 889e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 890e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template void C<A::B>::f(); 891e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <> void C<A::B>::g(); // expected-error {{private}} 892e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 893e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void A::f() { 894e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith C<B> cb; 895e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith cb.f(); 896e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 897e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 898e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 899e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr183 { // dr183: sup 382 900e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T> struct A {}; 901e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T> struct B { 902e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef int X; 903e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 904e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<> struct A<int> { 905e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typename B<int>::X x; 906e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 907e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 908e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 909e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr184 { // dr184: yes 910e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<typename T = float> struct B {}; 911e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 912e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<template<typename TT = float> class T> struct A { 913e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f(); 914e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void g(); 915e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 916e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 917e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<template<typename TT> class T> void A<T>::f() { // expected-note {{here}} 918e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith T<> t; // expected-error {{too few template arguments}} 919e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 920e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 921e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<template<typename TT = char> class T> void A<T>::g() { 922e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith T<> t; 923e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef T<> X; 924e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef T<char> X; 925e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 926e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 927e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void h() { A<B>().g(); } 928e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 929e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 930e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr185 FIXME: add codegen test 931e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 932e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr187 { // dr187: sup 481 933e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith const int Z = 1; 934e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template<int X = Z, int Z = X> struct A; 935e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef A<> T; 936e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith typedef A<1, 1> T; 937e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 938e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 939e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr188 { // dr188: yes 940e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith char c[10]; 941e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int check[sizeof(0, c) == 10 ? 1 : -1]; 942e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 943e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 944e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr190 FIXME: add codegen test for tbaa 945e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 946e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr193 FIXME: add codegen test 947e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 948e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr194 { // dr194: yes 949e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct A { 950e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith A(); 951a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void A(); // expected-error {{constructor cannot have a return type}} 952e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 953e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct B { 954a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar void B(); // expected-error {{constructor cannot have a return type}} 955e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith B(); 956e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 957e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct C { 958e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith inline explicit C(int) {} 959e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 960e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 961e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 962e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr195 { // dr195: yes 963e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f(); 964e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int *p = (int*)&f; // expected-error 0-1{{extension}} 965e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void (*q)() = (void(*)())&p; // expected-error 0-1{{extension}} 966e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 967e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 968e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr197 { // dr197: yes 969e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith char &f(char); 970e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 971e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith template <class T> void g(T t) { 972e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith char &a = f(1); 973e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith char &b = f(T(1)); // expected-error {{unrelated type 'int'}} 974e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith char &c = f(t); // expected-error {{unrelated type 'int'}} 975e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 976e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 977e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void f(int); 978e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 979e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith enum E { e }; 980e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int &f(E); 981e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 982e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith void h() { 983e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith g('a'); 984e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith g(2); 985e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith g(e); // expected-note {{in instantiation of}} 986e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith } 987e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 988e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 989e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr198 { // dr198: yes 990e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct A { 991e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int n; 992e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct B { 993e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int m[sizeof(n)]; 994e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#if __cplusplus < 201103L 995e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith // expected-error@-2 {{invalid use of non-static data member}} 996e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#endif 997e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int f() { return n; } 998e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith // expected-error@-1 {{use of non-static data member 'n' of 'A' from nested type 'B'}} 999e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 1000e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct C; 1001e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct D; 1002e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 1003e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct A::C { 1004e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int m[sizeof(n)]; 1005e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#if __cplusplus < 201103L 1006e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith // expected-error@-2 {{invalid use of non-static data member}} 1007e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#endif 1008e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int f() { return n; } 1009e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith // expected-error@-1 {{use of non-static data member 'n' of 'A' from nested type 'C'}} 1010e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 1011e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith struct A::D : A { 1012e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int m[sizeof(n)]; 1013e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#if __cplusplus < 201103L 1014e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith // expected-error@-2 {{invalid use of non-static data member}} 1015e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#endif 1016e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith int f() { return n; } 1017e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith }; 1018e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith} 1019e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith 1020e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr199 FIXME: add codegen test 1021