1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 template<typename T> 3 struct X { 4 X<T*> *ptr; 5 }; 6 7 X<int> x; 8 9 template<> 10 struct X<int***> { 11 typedef X<int***> *ptr; 12 }; 13 14 X<float>::X<int> xi = x; // expected-error{{qualified reference to 'X' is a constructor name rather than a template name wherever a constructor can be declared}} 15 16 // [temp.local]p1: 17 18 // FIXME: test template template parameters 19 template<typename T, typename U> 20 struct X0 { 21 typedef T type; 22 typedef U U_type; 23 typedef U_type U_type2; 24 25 void f0(const X0&); // expected-note{{here}} 26 void f0(X0&); 27 void f0(const X0<T, U>&); // expected-error{{redecl}} 28 29 void f1(const X0&); // expected-note{{here}} 30 void f1(X0&); 31 void f1(const X0<type, U_type2>&); // expected-error{{redecl}} 32 33 void f2(const X0&); // expected-note{{here}} 34 void f2(X0&); 35 void f2(const ::X0<type, U_type2>&); // expected-error{{redecl}} 36 }; 37 38 template<typename T, T N> 39 struct X1 { 40 void f0(const X1&); // expected-note{{here}} 41 void f0(X1&); 42 void f0(const X1<T, N>&); // expected-error{{redecl}} 43 }; 44 45 namespace pr6326 { 46 template <class T> class A { 47 friend class A; 48 }; 49 template class A<int>; 50 } 51 52 namespace ForwardDecls { 53 template<typename T> 54 struct X; 55 56 template<typename T> 57 struct X { 58 typedef T foo; 59 typedef X<T> xt; 60 typename xt::foo *t; 61 }; 62 } 63 64 namespace ConflictingRedecl { 65 template<typename> struct Nested { 66 template<typename> struct Nested; // expected-error {{member 'Nested' has the same name as its class}} 67 }; 68 } 69