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