1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr300 { // dr300: yes 6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename R, typename A> void f(R (&)(A)) {} 7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int g(int); 8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h() { f(g); } 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr301 { // dr301: yes 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // see also dr38 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S; 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void operator+(T, T); 15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void operator-(S, S); 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() { 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool a = (void(*)(S, S))operator+<S> < 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (void(*)(S, S))operator+<S>; 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool b = (void(*)(S, S))operator- < 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (void(*)(S, S))operator-; 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool c = (void(*)(S, S))operator+ < 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (void(*)(S, S))operator-; // expected-error {{expected '>'}} 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void f() { 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typename T::template operator+<int> a; // expected-error {{typename specifier refers to a non-type template}} expected-error +{{}} 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This shouldn't say (null). 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class T::template operator+<int> b; // expected-error {{identifier followed by '<' indicates a class template specialization but (null) refers to a function template}} 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum T::template operator+<int> c; // expected-error {{expected identifier}} expected-error {{does not declare anything}} 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum T::template operator+<int>::E d; // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}} expected-error {{forward reference}} 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum T::template X<int>::E e; 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T::template operator+<int>::foobar(); // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}} 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T::template operator+<int>(0); // ok 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> class operator&<T*> {}; // expected-error +{{}} 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> class T::operator& {}; // expected-error +{{}} 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> class S::operator&<T*> {}; // expected-error +{{}} 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr302 { // dr302: yes 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { A(); ~A(); }; 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { // expected-error {{implicit default constructor for 'dr302::B' must explicitly initialize the const member 'n'}} 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int n; // expected-note {{declared here}} 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A a; 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } b = B(); // expected-note {{first required here}} 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Trivial default constructor C::C() is not called here. 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C { 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int n; 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } c = C(); 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int n; // expected-note {{deleted because field 'n' of const-qualified type 'const int' would not be initialized}} 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A a; 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } b = B(); // expected-error {{call to implicitly-deleted default constructor}} 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // C::C() is called here, because even though it's trivial, it's deleted. 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C { 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int n; // expected-note {{deleted because field 'n' of const-qualified type 'const int' would not be initialized}} 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } c = C(); // expected-error {{call to implicitly-deleted default constructor}} 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct D { 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int n = 0; 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } d = D(); 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr303: na 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr304 { // dr304: yes 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int &a; 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int n = a(); // expected-error {{requires an initializer}} 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S { int &b; }; 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int m = S().b; 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-3 {{requires an initializer}} 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-3 {{in value-initialization}} 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{deleted}} 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-7 {{reference}} 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr305 { // dr305: no 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef A C; 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(A *a) { 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A {}; 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a->~A(); 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a->~C(); 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef A B; 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g(B *b) { 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines b->~B(); 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines b->~C(); 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h(B *b) { 100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B {}; // expected-note {{declared here}} 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines b->~B(); // expected-error {{does not match}} 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct X {}; 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void i(X<int>* x) { 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X {}; 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x->~X<int>(); 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x->~X(); 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines x->~X<char>(); // expected-error {{no member named}} 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This appears to be valid (but allowing the nested types might be a 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // defect). 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct Nested { 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct Nested {}; 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void testNested(Nested<int> n) { n.~Nested<int>(); } // expected-error {{no member named}} 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-2 {{ambiguous}} 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-6 {{here}} 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-6 {{here}} 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct Y { 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> using T1 = Y; 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> using T2 = Y; 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void j(Y *y) { 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines y->~T1<int>(); 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines y->~T2<int>(); 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct Z { 134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> using T2 = T; 135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void k(Z *z) { 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This diagnostic is terrible. 138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines z->~T1<int>(); // expected-error {{'T1' following the 'template' keyword does not refer to a template}} expected-error +{{}} 139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines z->~T2<int>(); // expected-error {{no member named '~int'}} 140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines z->~T2<Z>(); 141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This is valid. 144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace Q { 145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename A> struct R {}; 146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename A> using R = Q::R<int>; 148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void qr(Q::R<int> x) { x.~R<char>(); } // expected-error {{no member named}} 149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr306 { // dr306: no 153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: dup 39 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This should be accepted. 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { struct B {}; }; // expected-note 2{{member}} 156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C { typedef A::B B; }; // expected-note {{member}} 157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct D : A, A::B, C {}; 158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D::B b; // expected-error {{found in multiple base classes of different types}} 159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr307: na 162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr308 { // dr308: yes 164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // This is mostly an ABI library issue. 165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A {}; 166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B : A {}; 167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C : A {}; 168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct D : B, C {}; 169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() { 170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines try { 171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines throw D(); 172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } catch (const A&) { 173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // unreachable 174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } catch (const B&) { 175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // get here instead 176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr309: dup 485 181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr311 { // dr311: yes 183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace X { namespace Y {} } 184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace X::Y {} // expected-error {{must define each namespace separately}} 185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace X { 186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace X::Y {} // expected-error {{must define each namespace separately}} 187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: The diagnostics here are not very good. 189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace ::dr311::X {} // expected-error 2+{{}} // expected-warning {{extra qual}} 190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr312: dup 616 193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr313 { // dr313: dup 299 c++11 195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { operator int() const; }; 196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int *p = new int[A()]; 197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: should this be available in c++98 mode? expected-error@-2 {{extension}} 199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr314 { // dr314: dup 1710 203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct A { 204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename U> struct B {}; 205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct C : public A<T>::template B<T> { 207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C() : A<T>::template B<T>() {} 208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr315: na 212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr316: sup 1004 213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr317 { // dr317: 3.5 215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() {} // expected-note {{previous}} 216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines inline void f(); // expected-error {{inline declaration of 'f' follows non-inline definition}} 217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int g(); 219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int n = g(); 220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines inline int g() { return 0; } 221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int h(); 223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int m = h(); 224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int h() { return 0; } // expected-note {{previous}} 225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines inline int h(); // expected-error {{inline declaration of 'h' follows non-inline definition}} 226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr318 { // dr318: sup 1310 229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A {}; 230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A::A a; 231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr319 { // dr319: no 234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: dup dr389 235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: We don't have a diagnostic for a name with linkage 236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // having a type without linkage. 237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef struct { 238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int i; 239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } *ps; 240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" void f(ps); 241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g(ps); // FIXME: ill-formed, type 'ps' has no linkage 242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static enum { e } a1; 244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum { e2 } a2; // FIXME: ill-formed, enum type has no linkage 245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum { n1 = 1u }; 247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int (*pa)[n1]; 248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines pa parr; // ok, type has linkage despite using 'n1' 249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct X {}; 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() { 253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { int n; }; 254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern A a; // FIXME: ill-formed 255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines X<A> xa; 256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef A B; 258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern B b; // FIXME: ill-formed 259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines X<B> xb; 260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int n = 1; 262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int (*C)[n]; 263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern C c; // ok 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines X<C> xc; 265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-12 {{uses local type 'A'}} 268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-9 {{uses local type 'A'}} 269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr320 { // dr320: yes 273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L 274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X { 275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines constexpr X() {} 276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines constexpr X(const X &x) : copies(x.copies + 1) {} 277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned copies = 0; 278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines constexpr X f(X x) { return x; } 280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines constexpr unsigned g(X x) { return x.copies; } 281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static_assert(f(X()).copies == g(X()) + 1, "expected one extra copy for return value"); 282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr321 { // dr321: dup 557 286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace N { 287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int> struct A { 288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int> struct B; 289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> template<> struct A<0>::B<0>; 291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(A<0>::B<0>); 292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> template<> struct N::A<0>::B<0> {}; 294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void g(T t) { f(t); } 296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template void g(N::A<0>::B<0>); 297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace N { 299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct I { friend bool operator==(const I&, const I&); }; 300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines N::I<int> i, j; 302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool x = i == j; 303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr322 { // dr322: yes 306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> operator T&(); 308651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } a; 309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &r = static_cast<int&>(a); 310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &s = a; 311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr323: no 314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr324 { // dr324: yes 316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S { int n : 1; } s; // expected-note 3{{bit-field is declared here}} 317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &a = s.n; // expected-error {{non-const reference cannot bind to bit-field}} 318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int *b = &s.n; // expected-error {{address of bit-field}} 319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &c = (s.n = 0); // expected-error {{non-const reference cannot bind to bit-field}} 320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int *d = &(s.n = 0); // expected-error {{address of bit-field}} 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &e = true ? s.n : s.n; // expected-error {{non-const reference cannot bind to bit-field}} 322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int *f = &(true ? s.n : s.n); // expected-error {{address of bit-field}} 323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &g = (void(), s.n); // expected-error {{non-const reference cannot bind to bit-field}} 324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int *h = &(void(), s.n); // expected-error {{address of bit-field}} 325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr326 { // dr326: yes 328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S {}; 329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int test[__is_trivially_constructible(S, const S&) ? 1 : -1]; 330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr327 { // dr327: dup 538 333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A; 334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class A {}; 335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class B; 337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B {}; 338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr328 { // dr328: yes 341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A; // expected-note 3{{forward declaration}} 342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { A a; }; // expected-error {{incomplete}} 343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct C { A a; }; // expected-error {{incomplete}} 344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A *p = new A[0]; // expected-error {{incomplete}} 345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr329 { // dr329: 3.5 348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B {}; 349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct A : B { 350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend void f(A a) { g(a); } 351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend void h(A a) { g(a); } // expected-error {{undeclared}} 352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend void i(B b) {} // expected-error {{redefinition}} expected-note {{previous}} 353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A<int> a; 355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A<char> b; // expected-note {{instantiation}} 356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void test() { 358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines h(a); // expected-note {{instantiation}} 359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr331 { // dr331: yes 363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A(volatile A&); // expected-note {{candidate}} 365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } const a, b(a); // expected-error {{no matching constructor}} 366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr332 { // dr332: dup 557 369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(volatile void); // expected-error {{'void' as parameter must not have type qualifiers}} 370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g(const void); // expected-error {{'void' as parameter must not have type qualifiers}} 371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h(int n, volatile void); // expected-error {{'void' must be the first and only parameter}} 372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr333 { // dr333: yes 375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int n = 0; 376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int f(int(n)); 377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int g((int(n))); 378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int h = f(g); 379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr334 { // dr334: yes 382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void f() { 383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T x; 384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f((x, 123)); 385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S { 387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend S operator,(S, int); 388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend void f(S); 389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template void f<S>(); 391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr335: no 394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr336 { // dr336: yes 396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace Pre { 397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T1> class A { 398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T2> class B { 399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T3> void mf1(T3); 400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mf2(); 401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> template<class X> class A<int>::B {}; 404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> template<> template<class T> void A<int>::B<double>::mf1(T t) {} // expected-error {{does not match}} 405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class Y> template<> void A<Y>::B<double>::mf2() {} // expected-error {{does not refer into a class}} 406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace Post { 408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T1> class A { 409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T2> class B { 410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T3> void mf1(T3); 411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mf2(); 412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> template<class X> class A<int>::B { 415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T> void mf1(T); 416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 417651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> template<> template<class T> void A<int>::B<double>::mf1(T t) {} 418651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This diagnostic isn't very good. 419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class Y> template<> void A<Y>::B<double>::mf2() {} // expected-error {{does not refer into a class}} 420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr337 { // dr337: yes 424651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void f(T (*)[1]); 425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> int &f(...); 426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { virtual ~A() = 0; }; 428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &r = f<A>(0); 429651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: The language rules here are completely broken. We cannot determine 431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // whether an incomplete type is abstract. See DR1640, which will probably 432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // supersede this one and remove this rule. 433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B; 434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int &s = f<B>(0); // expected-error {{of type 'void'}} 435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { virtual ~B() = 0; }; 436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr339 { // dr339: yes 439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <int I> struct A { static const int value = I; }; 440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char xxx(int); 442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char (&xxx(float))[2]; 443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T> A<sizeof(xxx((T)0))> f(T) {} // expected-note {{candidate}} 445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void test() { 447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A<1> a = f(0); 448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A<2> b = f(0.0f); 449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A<3> c = f("foo"); // expected-error {{no matching function}} 450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char f(int); 454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int f(...); 455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> struct conv_int { 457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const bool value = sizeof(f(T())) == 1; 458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> bool conv_int2(A<sizeof(f(T()))> p); 461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> A<sizeof(f(T()))> make_A(); 463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int a[conv_int<char>::value ? 1 : -1]; 465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool b = conv_int2<char>(A<1>()); 466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A<1> c = make_A<char>(); 467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr340 { // dr340: yes 470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { A(int); }; 471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { B(A, A, int); }; 472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int x, y; 473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines B b(A(x), A(y), 3); 474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr341 { // dr341: sup 1708 477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace A { 478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int n; 479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" int &dr341_a = n; // expected-note {{previous}} expected-note {{declared with C language linkage here}} 480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace B { 482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" int &dr341_a = dr341_a; // expected-error {{redefinition}} 483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" void dr341_b(); // expected-note {{declared with C language linkage here}} 485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint dr341_a; // expected-error {{declaration of 'dr341_a' in global scope conflicts with declaration with C language linkage}} 487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint dr341_b; // expected-error {{declaration of 'dr341_b' in global scope conflicts with declaration with C language linkage}} 488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint dr341_c; // expected-note {{declared in global scope here}} 489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint dr341_d; // expected-note {{declared in global scope here}} 490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr341 { 491651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" int dr341_c; // expected-error {{declaration of 'dr341_c' with C language linkage conflicts with declaration in global scope}} 492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" void dr341_d(); // expected-error {{declaration of 'dr341_d' with C language linkage conflicts with declaration in global scope}} 493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace A { extern "C" int dr341_e; } // expected-note {{previous}} 495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace B { extern "C" void dr341_e(); } // expected-error {{redefinition of 'dr341_e' as different kind of symbol}} 496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr342: na 499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr343 { // dr343: no 501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: dup 1710 502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct A { 503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename U> struct B {}; 504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: In these contexts, the 'template' keyword is optional. 506651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct C : public A<T>::B<T> { // expected-error {{use 'template'}} 507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C() : A<T>::B<T>() {} // expected-error {{use 'template'}} 508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 511651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr344 { // dr344: dup 1435 512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { inline virtual ~A(); }; 513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { friend A::~A(); }; 514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 516651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr345 { // dr345: yes 517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X {}; 519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int X; // expected-note {{here}} 520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { 522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X {}; 523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 524651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> void f(T t) { typename T::X x; } // expected-error {{refers to non-type member 'X'}} 525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(A a, B b) { 526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f(b); 527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f(a); // expected-note {{instantiation}} 528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr346: na 532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr347 { // dr347: yes 534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct base { 535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct nested; 536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static int n; 537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static void f(); 538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g(); 539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct derived : base {}; 542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct derived::nested {}; // expected-error {{no struct named 'nested'}} 544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int derived::n; // expected-error {{no member named 'n'}} 545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void derived::f() {} // expected-error {{does not match any}} 546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void derived::g() {} // expected-error {{does not match any}} 547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr348: na 550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr349 { // dr349: no 552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> operator T ***() { 554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int ***p = 0; 555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return p; // expected-error {{cannot initialize return object of type 'const int ***' with an lvalue of type 'int ***'}} 556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This is valid. 560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A a; 561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int *const *const *p1 = a; // expected-note {{in instantiation of}} 562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { 564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> operator T ***() { 565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int ***p = 0; 566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return p; 567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This is invalid. 571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines B b; 572651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const int *const *const *p2 = b; 573651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr351: na 576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr352 { // dr352: yes 578651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example1 { 579651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace A { 580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum E {}; 581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename R, typename A> void foo(E, R (*)(A)); // expected-note 2{{couldn't infer template argument 'R'}} 582651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 583651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void arg(T); 585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> int arg(T) = delete; // expected-note {{here}} expected-error 0-1{{extension}} 586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(A::E e) { 588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines foo(e, &arg); // expected-error {{no matching function}} 589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using A::foo; 591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines foo<int, int>(e, &arg); // expected-error {{deleted}} 592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int arg(int); 595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g(A::E e) { 597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines foo(e, &arg); // expected-error {{no matching function}} 598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using A::foo; 600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines foo<int, int>(e, &arg); // ok, uses non-template 601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace contexts { 605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> void f1(int (&)[I]); 606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> void f2(int (&)[I+1]); // expected-note {{couldn't infer}} 607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> void f3(int (&)[I+1], int (&)[I]); 608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() { 609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int a[4]; 610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int b[3]; 611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f1(a); 612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f2(a); // expected-error {{no matching function}} 613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f3(a, b); 614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> struct S {}; 617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> void g1(S<I>); 618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> void g2(S<I+1>); // expected-note {{couldn't infer}} 619651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> void g3(S<I+1>, S<I>); 620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g() { 621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines S<4> a; 622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines S<3> b; 623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines g1(a); 624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines g2(a); // expected-error {{no matching function}} 625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines g3(a, b); 626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void h1(T = 0); // expected-note {{couldn't infer}} 629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void h2(T, T = 0); 630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h() { 631651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines h1(); // expected-error {{no matching function}} 632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines h1(0); 633651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines h1<int>(); 634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines h2(0); 635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> int tmpl(T); 638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename R, typename A> void i1(R (*)(A)); // expected-note 3{{couldn't infer}} 639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename R, typename A> void i2(R, A, R (*)(A)); // expected-note {{not viable}} 640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void i() { 641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern int single(int); 642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i1(single); 643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i2(0, 0, single); 644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern int ambig(float), ambig(int); 646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i1(ambig); // expected-error {{no matching function}} 647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i2(0, 0, ambig); 648651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 649651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern void no_match(float), no_match(int); 650651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i1(no_match); // expected-error {{no matching function}} 651651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i2(0, 0, no_match); // expected-error {{no matching function}} 652651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 653651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i1(tmpl); // expected-error {{no matching function}} 654651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines i2(0, 0, tmpl); 655651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 658651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct is_int; 659651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> struct is_int<int> {}; 660651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 661651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example2 { 662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> int f(T (*p)(T)) { is_int<T>(); } 663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int g(int); 664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int g(char); 665651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int i = f(g); 666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example3 { 669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> int f(T, T (*p)(T)) { is_int<T>(); } 670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int g(int); 671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char g(char); 672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int i = f(1, g); 673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example4 { 676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> int f(T, T (*p)(T)) { is_int<T>(); } 677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char g(char); 678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> T g(T); 679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int i = f(1, g); 680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 681651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example5 { 683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> class A {}; 684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> void g(A<I+1>); // expected-note {{couldn't infer}} 685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int I> void f(A<I>, A<I+1>); 686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h(A<1> a1, A<2> a2) { 687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines g(a1); // expected-error {{no matching function}} 688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines g<0>(a1); 689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f(a1, a2); 690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 691651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 692651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 693651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 694651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr353 needs an IRGen test. 695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 696651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr354 { // dr354: yes c++11 697651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Should we allow this in C++98 too? 698651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S {}; 699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 700651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int*> struct ptr {}; // expected-note +{{here}} 701651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ptr<0> p0; 702651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ptr<(int*)0> p1; 703651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ptr<(float*)0> p2; 704651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ptr<(int S::*)0> p3; 705651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 706651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{does not refer to any decl}} 707651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{does not refer to any decl}} 708651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{does not refer to any decl}} 709651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{does not refer to any decl}} 710651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else 711651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-10 {{must be cast}} 712651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // ok 713651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-10 {{does not match}} 714651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-10 {{does not match}} 715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 716651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int*> int both(); 718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int> int both(); 719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int b0 = both<0>(); 720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int b1 = both<(int*)0>(); 721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-2 {{no matching function}} 723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-6 {{candidate}} 724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-6 {{candidate}} 725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 727651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<int S::*> struct ptr_mem {}; // expected-note +{{here}} 728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ptr_mem<0> m0; 729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ptr_mem<(int S::*)0> m1; 730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ptr_mem<(float S::*)0> m2; 731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ptr_mem<(int *)0> m3; 732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{cannot be converted}} 734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{is not a pointer to member constant}} 735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{cannot be converted}} 736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{cannot be converted}} 737651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else 738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-10 {{must be cast}} 739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // ok 740651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-10 {{does not match}} 741651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-10 {{does not match}} 742651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 743651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 744651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 745651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct dr355_S; // dr355: yes 746651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct ::dr355_S {}; // expected-warning {{extra qualification}} 747651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr355 { struct ::dr355_S s; } 748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr356: na 750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr357 { // dr357: yes 752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct A { 753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() const; // expected-note {{const qualified}} 754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void A<T>::f() {} // expected-error {{does not match}} 756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { 758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void f(); 759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 760651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void B::f() const {} // expected-error {{does not match}} 761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 763651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr358 { // dr358: yes 764651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" void dr358_f(); 765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace N { 766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int var; 767651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" void dr358_f() { var = 10; } 768651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 769651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr359 { // dr359: yes 772651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Note, the example in the DR is wrong; it doesn't contain an anonymous 773651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // union. 774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct E { 775651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines union { 776651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct { 777651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int x; 778651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } s; 779651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } v; 780651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines union { 782651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct { // expected-error {{extension}} 783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int x; 784651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } s; 785651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 786651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S { // expected-error {{types cannot be declared in an anonymous union}} 787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int x; 788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } t; 789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines union { // expected-error {{extension}} 791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int u; 792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr362: na 798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr363: na 799651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr364 { // dr364: yes 801651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S { 802651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static void f(int); 803651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(char); 804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 805651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 806651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g() { 807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines S::f('a'); // expected-error {{call to non-static}} 808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines S::f(0); 809651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 811651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 812651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if "foo" // expected-error {{invalid token}} dr366: yes 813651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 814651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 815651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr367 { // dr367: yes 816651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: These diagnostics are terrible. Don't diagnose an ill-formed global 817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // array as being a VLA! 818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int a[true ? throw 0 : 4]; // expected-error 2{{variable length array}} 819651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int b[true ? 4 : throw 0]; 820651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int c[true ? *new int : 4]; // expected-error 2{{variable length array}} 821651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int d[true ? 4 : *new int]; 822651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 823651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-4 {{variable length array}} expected-error@-4 {{constant expression}} 824651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-3 {{variable length array}} expected-error@-3 {{constant expression}} 825651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 826651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 827651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 828651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr368 { // dr368: yes 829651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T, T> struct S {}; // expected-note {{here}} 830651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> int f(S<T, T()> *); // expected-error {{function type}} 831651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines //template<typename T> int g(S<T, (T())> *); // FIXME: crashes clang 832651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> int g(S<T, true ? T() : T()> *); // expected-note {{cannot have type 'dr368::X'}} 833651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X {}; 834651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int n = g<X>(0); // expected-error {{no matching}} 835651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 836651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 837651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr370: na 838651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr372 { // dr372: no 840651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example1 { 841651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct X { 842651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines protected: 843651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T Type; // expected-note 2{{protected}} 844651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 845651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct Y {}; 846651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 847651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: These two are valid; deriving from T1<T> gives Z1 access to 848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // the protected member T1<T>::Type. 849651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T, 850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> class T1, 851651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> class T2> struct Z1 : 852651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T1<T>, 853651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T2<typename T1<T>::Type> {}; // expected-error {{protected}} 854651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 855651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T, 856651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> class T1, 857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> class T2> struct Z2 : 858651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T2<typename T1<T>::Type>, // expected-error {{protected}} 859651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T1<T> {}; 860651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Z1<int, X, Y> z1; // expected-note {{instantiation of}} 862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Z2<int, X, Y> z2; // expected-note {{instantiation of}} 863651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 864651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 865651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example2 { 866651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X { 867651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines private: 868651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int Type; // expected-note {{private}} 869651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 870651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct A { 871651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typename T::Type t; // expected-error {{private}} 872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A<X> ax; // expected-note {{instantiation of}} 874651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example3 { 877651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines protected: 879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int N; // expected-note 2{{protected}} 880651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 881651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct B {}; 883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename U> struct C : U, B<typename U::N> {}; // expected-error {{protected}} 884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename U> struct D : B<typename U::N>, U {}; // expected-error {{protected}} 885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 886651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C<A> x; // expected-note {{instantiation of}} 887651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D<A> y; // expected-note {{instantiation of}} 888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 889651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example4 { 891651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class A { 892651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class B {}; 893651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend class X; 894651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 895651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 896651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct X : A::B { 897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A::B mx; 898651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class Y { 899651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A::B my; 900651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 901651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 902651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 904651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 905651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr373 { // dr373: no 906651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This is valid. 907651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace X { int dr373; } // expected-note 2{{here}} 908651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct dr373 { // expected-note {{here}} 909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() { 910651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines using namespace dr373::X; // expected-error {{no namespace named 'X' in 'dr373::dr373'}} 911651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int k = dr373; // expected-error {{does not refer to a value}} 912651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace Y = dr373::X; // expected-error {{no namespace named 'X' in 'dr373::dr373'}} 914651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines k = Y::dr373; 915651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 919651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr374 { // dr374: yes c++11 920651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace N { 921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void f(); 922651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct A { void f(); }; 923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> void N::f<char>() {} 925651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> void N::A<char>::f() {} 926651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<> struct N::A<int> {}; 927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 928651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-4 {{extension}} expected-note@-7 {{here}} 929651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-4 {{extension}} expected-note@-7 {{here}} 930651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-4 {{extension}} expected-note@-8 {{here}} 931651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 933651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 934651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr375: dup 345 935651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr376: na 936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr377 { // dr377: yes 938651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum E { // expected-error {{enumeration values exceed range of largest integer}} 939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a = -__LONG_LONG_MAX__ - 1, // expected-error 0-1{{extension}} 940651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines b = 2 * (unsigned long long)__LONG_LONG_MAX__ // expected-error 0-2{{extension}} 941651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr378: dup 276 945651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr379: na 946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr381 { // dr381: yes 948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 949651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int a; 950651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 951651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B : virtual A {}; 952651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C : B {}; 953651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct D : B {}; 954651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct E : public C, public D {}; 955651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct F : public A {}; 956651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() { 957651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines E e; 958651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines e.B::a = 0; // expected-error {{ambiguous conversion}} 959651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines F f; 960651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f.A::a = 1; 961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 962651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 963651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 964651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr382 { // dr382: yes c++11 965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Should we allow this in C++98 mode? 966651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { typedef int T; }; 967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typename A::T t; 968651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typename dr382::A a; 969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-3 {{occurs outside of a template}} 971651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-3 {{occurs outside of a template}} 972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typename A b; // expected-error {{expected a qualified name}} 974651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 975651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 976651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr383 { // dr383: yes 977651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { A &operator=(const A&); }; 978651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { ~B(); }; 979651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines union C { C &operator=(const C&); }; 980651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines union D { ~D(); }; 981651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int check[(__is_pod(A) || __is_pod(B) || __is_pod(C) || __is_pod(D)) ? -1 : 1]; 982651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 983651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 984651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr384 { // dr384: yes 985651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace N1 { 986651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct Base {}; 987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct X { 988651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct Y : public Base<T> { 989651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Y operator+(int) const; 990651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 991651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Y f(unsigned i) { return Y() + i; } 992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace N2 { 996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct Z {}; 997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> int *operator+(T, unsigned); 998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 999651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int main() { 1001651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines N1::X<N2::Z> v; 1002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines v.f(0); 1003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1005651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr385 { // dr385: yes 1007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { protected: void f(); }; 1008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B : A { using A::f; }; 1009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C : A { void g(B b) { b.f(); } }; 1010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h(B b) { b.f(); } 1011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1012651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct D { int n; }; // expected-note {{member}} 1013651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct E : protected D {}; // expected-note 2{{protected}} 1014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct F : E { friend int i(E); }; 1015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int i(E e) { return e.n; } // expected-error {{protected base}} expected-error {{protected member}} 1016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1017651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1018651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr387 { // dr387: yes 1019651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace old { 1020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> class number { 1021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines number(int); // expected-note 2{{here}} 1022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend number gcd(number &x, number &y) {} 1023651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1024651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g() { 1026651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines number<double> a(3), b(4); // expected-error 2{{private}} 1027651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a = gcd(a, b); 1028651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines b = gcd(3, 4); // expected-error {{undeclared}} 1029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1031651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace newer { 1033651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T> class number { 1034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines public: 1035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines number(int); 1036651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend number gcd(number x, number y) { return 0; } 1037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1038651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g() { 1040651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines number<double> a(3), b(4); 1041651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines a = gcd(a, b); 1042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines b = gcd(3, 4); // expected-error {{undeclared}} 1043651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1047651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: dr388 needs codegen test 1048651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1049651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr389 { // dr389: no 1050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S { 1051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef struct {} A; 1052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef enum {} B; 1053651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef struct {} const C; // expected-note 0-2{{here}} 1054651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef enum {} const D; // expected-note 0-1{{here}} 1055651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1056651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename> struct T {}; 1057651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1058651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct WithLinkage1 {}; 1059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines enum WithLinkage2 {}; 1060651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef struct {} *WithLinkage3a, WithLinkage3b; 1061651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef enum {} WithLinkage4a, *WithLinkage4b; 1062651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef S::A WithLinkage5; 1063651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef const S::B WithLinkage6; 1064651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int WithLinkage7; 1065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef void (*WithLinkage8)(WithLinkage2 WithLinkage1::*, WithLinkage5 *); 1066651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage5> WithLinkage9; 1067651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1068651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef struct {} *WithoutLinkage1; // expected-note 0-1{{here}} 1069651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef enum {} const WithoutLinkage2; // expected-note 0-1{{here}} 1070651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // These two types don't have linkage even though they are externally visible 1071651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // and the ODR requires them to be merged across TUs. 1072651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef S::C WithoutLinkage3; 1073651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef S::D WithoutLinkage4; 1074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef void (*WithoutLinkage5)(int (WithoutLinkage3::*)(char)); 1075651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1076651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L 1077651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // This has linkage even though its template argument does not. 1078651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This is probably a defect. 1079651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithoutLinkage1> WithLinkage10; 1080651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else 1081651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int WithLinkage10; // dummy 1082651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1083651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage1> GoodArg1; 1084651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage2> GoodArg2; 1085651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage3a> GoodArg3a; 1086651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage3b> GoodArg3b; 1087651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage4a> GoodArg4a; 1088651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage4b> GoodArg4b; 1089651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage5> GoodArg5; 1090651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage6> GoodArg6; 1091651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage7> GoodArg7; 1092651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage8> GoodArg8; 1093651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithLinkage9> GoodArg9; 1094651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1095651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithoutLinkage1> BadArg1; // expected-error{{template argument uses}} 1096651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithoutLinkage2> BadArg2; // expected-error{{template argument uses}} 1097651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithoutLinkage3> BadArg3; // expected-error{{template argument uses}} 1098651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithoutLinkage4> BadArg4; // expected-error{{template argument uses}} 1099651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T<WithoutLinkage5> BadArg5; // expected-error{{template argument uses}} 1100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 1101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage1 withLinkage1; 1103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage2 withLinkage2; 1104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage3a withLinkage3a; 1105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage3b withLinkage3b; 1106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage4a withLinkage4a; 1107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage4b withLinkage4b; 1108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage5 withLinkage5; 1109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage6 withLinkage6; 1110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage7 withLinkage7; 1111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage8 withLinkage8; 1112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage9 withLinkage9; 1113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithLinkage10 withLinkage10; 1114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: These are all ill-formed. 1116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage1 withoutLinkage1; 1117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage2 withoutLinkage2; 1118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage3 withoutLinkage3; 1119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage4 withoutLinkage4; 1120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage5 withoutLinkage5; 1121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // OK, extern "C". 1123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern "C" { 1124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage1 dr389_withoutLinkage1; 1125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage2 dr389_withoutLinkage2; 1126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage3 dr389_withoutLinkage3; 1127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage4 dr389_withoutLinkage4; 1128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage5 dr389_withoutLinkage5; 1129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // OK, defined. 1132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WithoutLinkage1 withoutLinkageDef1; 1133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WithoutLinkage2 withoutLinkageDef2 = WithoutLinkage2(); 1134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WithoutLinkage3 withoutLinkageDef3 = {}; 1135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WithoutLinkage4 withoutLinkageDef4 = WithoutLinkage4(); 1136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines WithoutLinkage5 withoutLinkageDef5; 1137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void use(const void *); 1139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void use_all() { 1140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&withLinkage1); use(&withLinkage2); use(&withLinkage3a); use(&withLinkage3b); 1141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&withLinkage4a); use(&withLinkage4b); use(&withLinkage5); use(&withLinkage6); 1142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&withLinkage7); use(&withLinkage8); use(&withLinkage9); use(&withLinkage10); 1143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&withoutLinkage1); use(&withoutLinkage2); use(&withoutLinkage3); 1145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&withoutLinkage4); use(&withoutLinkage5); 1146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&dr389_withoutLinkage1); use(&dr389_withoutLinkage2); 1148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&dr389_withoutLinkage3); use(&dr389_withoutLinkage4); 1149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&dr389_withoutLinkage5); 1150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&withoutLinkageDef1); use(&withoutLinkageDef2); use(&withoutLinkageDef3); 1152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines use(&withoutLinkageDef4); use(&withoutLinkageDef5); 1153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void local() { 1156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: This is ill-formed. 1157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern WithoutLinkage1 withoutLinkageLocal; 1158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr390 { // dr390: yes 1162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> 1163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 1164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A() { f(); } // expected-warning {{call to pure virt}} 1165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void f() = 0; // expected-note {{here}} 1166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual ~A() = 0; 1167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> A<T>::~A() { T::error; } // expected-error {{cannot be used prior to}} 1169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void A<T>::f() { T::error; } // ok, not odr-used 1170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B : A<int> { // expected-note 2{{in instantiation of}} 1171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() {} 1172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } b; 1173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr391 { // dr391: yes c++11 1176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Should this apply to C++98 too? 1177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines class A { A(const A&); }; // expected-note 0-1{{here}} 1178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A fa(); 1179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const A &a = fa(); 1180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 1181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-2 {{C++98 requires an accessible copy constructor}} 1182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 1183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { B(const B&) = delete; }; // expected-error 0-1{{extension}} expected-note 0-1{{here}} 1185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines B fb(); 1186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const B &b = fb(); 1187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L 1188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-2 {{deleted}} 1189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 1190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> 1192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C { 1193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C(const C&) { T::error; } 1194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C<int> fc(); 1196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const C<int> &c = fc(); 1197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr392 FIXME write codegen test 1200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr394: na 1201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr395 { // dr395: yes 1203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S { 1204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T, int N>(&operator T())[N]; // expected-error {{must use a typedef}} 1205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T, int N> operator(T (&)[N])(); // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error +{{}} 1206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T> operator T *() const { return 0; } 1207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T, typename U> operator T U::*() const { return 0; } 1208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T, typename U> operator T (U::*)()() const { return 0; } // expected-error +{{}} 1209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct null1_t { 1212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T, class U> struct ptr_mem_fun_t { 1213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef T (U::*type)(); 1214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T, class U> 1217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines operator typename ptr_mem_fun_t<T, U>::type() const { // expected-note {{couldn't infer}} 1218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 0; 1219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } null1; 1221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int (S::*p)() = null1; // expected-error {{no viable conversion}} 1222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T> using id = T; // expected-error 0-1{{extension}} 1224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct T { 1226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T, int N> operator id<T[N]> &(); 1227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T, typename U> operator id<T (U::*)()>() const; 1228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct null2_t { 1231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T, class U> using ptr_mem_fun_t = T (U::*)(); // expected-error 0-1{{extension}} 1232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<class T, class U> operator ptr_mem_fun_t<T, U>() const { return 0; }; 1233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } null2; 1234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int (S::*q)() = null2; 1235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr396 { // dr396: yes 1238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() { 1239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto int a(); // expected-error {{storage class on function}} 1240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int (i); // expected-note {{previous}} 1241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines auto int (i); // expected-error {{redefinition}} 1242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L 1243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-4 {{'auto' storage class}} expected-error@-2 {{'auto' storage class}} 1244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif 1245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr397: sup 1823 1249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr398 { // dr398: yes 1251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example1 { 1252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct S { 1253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static int const I = 42; 1254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <int N> struct X {}; 1256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T> void f(X<T::I> *) {} 1257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <typename T> void f(X<T::J> *) {} 1258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void foo() { f<S>(0); } 1259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines namespace example2 { 1262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <int I> struct X {}; 1263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <template <class T> class> struct Z {}; 1264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> void f(typename T::Y *) {} // expected-note 2{{substitution failure}} 1265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> void g(X<T::N> *) {} // expected-note {{substitution failure}} 1266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template <class T> void h(Z<T::template TT> *) {} // expected-note {{substitution failure}} 1267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A {}; 1268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B { 1269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int Y; 1270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C { 1272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int N; 1273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct D { 1275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines typedef int TT; 1276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 1277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void test() { 1279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f<A>(0); // expected-error {{no matching function}} 1280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines f<B>(0); // expected-error {{no matching function}} 1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines g<C>(0); // expected-error {{no matching function}} 1282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines h<D>(0); // expected-error {{no matching function}} 1283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1286