1 // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2 // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 3 // RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 4 5 namespace dr500 { // dr500: dup 372 6 class D; 7 class A { 8 class B; 9 class C; 10 friend class D; 11 }; 12 class A::B {}; 13 class A::C : public A::B {}; 14 class D : public A::B {}; 15 } 16 17 namespace dr501 { // dr501: yes 18 struct A { 19 friend void f() {} 20 void g() { 21 void (*p)() = &f; // expected-error {{undeclared identifier}} 22 } 23 }; 24 } 25 26 namespace dr502 { // dr502: yes 27 struct Q {}; 28 template<typename T> struct A { 29 enum E { e = 1 }; 30 void q1() { f(e); } 31 void q2() { Q arr[sizeof(E)]; f(arr); } 32 void q3() { Q arr[e]; f(arr); } 33 void sanity() { Q arr[1]; f(arr); } // expected-error {{undeclared identifier 'f'}} 34 }; 35 int f(A<int>::E); 36 template<int N> int f(Q (&)[N]); 37 template struct A<int>; 38 } 39 40 namespace dr505 { // dr505: yes 41 const char *exts = "\e\(\{\[\%"; // expected-error 5{{use of non-standard escape}} 42 const char *unknown = "\Q"; // expected-error {{unknown escape sequence}} 43 } 44 45 namespace dr506 { // dr506: yes 46 struct NonPod { ~NonPod(); }; 47 void f(...); 48 void g(NonPod np) { f(np); } // expected-error {{cannot pass}} 49 } 50 51 // FIXME: Add tests here once DR260 is resolved. 52 // dr507: dup 260 53 54 // dr508: na 55 // dr509: na 56 // dr510: na 57 58 namespace dr512 { // dr512: yes 59 struct A { 60 A(int); 61 }; 62 union U { A a; }; 63 #if __cplusplus < 201103L 64 // expected-error@-2 {{has a non-trivial constructor}} 65 // expected-note@-6 {{no default constructor}} 66 // expected-note@-6 {{suppressed by user-declared constructor}} 67 #endif 68 } 69 70 // dr513: na 71 72 namespace dr514 { // dr514: yes 73 namespace A { extern int x, y; } 74 int A::x = y; 75 } 76 77 namespace dr515 { // dr515: sup 1017 78 // FIXME: dr1017 reverses the wording of dr515, but the current draft has 79 // dr515's wording, with a different fix for dr1017. 80 81 struct X { int n; }; 82 template<typename T> struct Y : T { 83 int f() { return X::n; } 84 }; 85 int k = Y<X>().f(); 86 87 struct A { int a; }; 88 struct B { void f() { int k = sizeof(A::a); } }; 89 #if __cplusplus < 201103L 90 // expected-error@-2 {{invalid use of non-static data member}} 91 #endif 92 } 93 94 // dr516: na 95 96 namespace dr517 { // dr517: no 97 // This is NDR, but we should diagnose it anyway. 98 template<typename T> struct S {}; 99 template<typename T> int v = 0; // expected-error 0-1{{extension}} 100 101 template struct S<int*>; 102 template int v<int*>; 103 104 S<char&> s; 105 int k = v<char&>; 106 107 // FIXME: These are both ill-formed. 108 template<typename T> struct S<T*> {}; 109 template<typename T> int v<T*> = 0; // expected-error 0-1{{extension}} 110 111 // FIXME: These are both ill-formed. 112 template<typename T> struct S<T&> {}; 113 template<typename T> int v<T&> = 0; // expected-error 0-1{{extension}} 114 } 115 116 namespace dr518 { // dr518: yes c++11 117 enum E { e, }; 118 #if __cplusplus < 201103L 119 // expected-error@-2 {{C++11 extension}} 120 #endif 121 } 122 123 namespace dr519 { // dr519: yes 124 // FIXME: Add a codegen test. 125 #if __cplusplus >= 201103L 126 #define fold(x) (__builtin_constant_p(x) ? (x) : (x)) 127 int test[fold((int*)(void*)0) ? -1 : 1]; 128 #undef fold 129 #endif 130 } 131 132 // dr520: na 133 134 // dr521: no 135 // FIXME: The wording here is broken. It's not reasonable to expect a 136 // diagnostic here. Once the relevant DR gets a number, mark this as a dup. 137 138 namespace dr522 { // dr522: yes 139 struct S {}; 140 template<typename T> void b1(volatile T &); 141 template<typename T> void b2(volatile T * const *); 142 template<typename T> void b2(volatile T * const S::*); 143 template<typename T> void b2(volatile T * const S::* const *); 144 // FIXME: This diagnostic isn't very good. The problem is not substitution failure. 145 template<typename T> void b2a(volatile T *S::* const *); // expected-note {{substitution failure}} 146 147 template<typename T> struct Base {}; 148 struct Derived : Base<int> {}; 149 template<typename T> void b3(Base<T>); 150 template<typename T> void b3(Base<T> *); 151 152 void test(int n, const int cn, int **p, int *S::*pm) { 153 int *a[3], *S::*am[3]; 154 const Derived cd = Derived(); 155 Derived d[3]; 156 157 b1(n); 158 b1(cn); 159 b2(p); 160 b2(pm); 161 b2(a); 162 b2(am); 163 b2a(am); // expected-error {{no matching function}} 164 b3(d); 165 b3(cd); 166 } 167 } 168 169 namespace dr524 { // dr524: yes 170 template<typename T> void f(T a, T b) { operator+(a, b); } // expected-error {{call}} 171 172 struct S {}; 173 void operator+(S, S); 174 template void f(S, S); 175 176 namespace N { struct S {}; } 177 void operator+(N::S, N::S); // expected-note {{should be declared}} 178 template void f(N::S, N::S); // expected-note {{instantiation}} 179 } 180 181 namespace dr525 { // dr525: yes 182 namespace before { 183 // Note, the example was correct prior to the change; instantiation is 184 // required for cases like this: 185 template <class T> struct D { operator T*(); }; 186 void g(D<double> ppp) { 187 delete ppp; 188 } 189 } 190 namespace after { 191 template <class T> struct D { typename T::error e; }; // expected-error {{prior to '::'}} 192 void g(D<double> *ppp) { 193 delete ppp; // expected-note {{instantiation of}} 194 } 195 } 196 } 197 198 // PR8130 199 namespace dr532 { // dr532: 3.5 200 struct A { }; 201 202 template<class T> struct B { 203 template<class R> int &operator*(R&); 204 }; 205 206 template<class T, class R> float &operator*(T&, R&); 207 void test() { 208 A a; 209 B<A> b; 210 int &ir = b * a; 211 } 212 } 213