// RUN: %clang_cc1 -fsyntax-only -verify %s template struct X { X *ptr; }; X x; template<> struct X { typedef X *ptr; }; X::X xi = x; // expected-error{{qualified reference to 'X' is a constructor name rather than a template name wherever a constructor can be declared}} // [temp.local]p1: // FIXME: test template template parameters template struct X0 { typedef T type; typedef U U_type; typedef U_type U_type2; void f0(const X0&); // expected-note{{here}} void f0(X0&); void f0(const X0&); // expected-error{{redecl}} void f1(const X0&); // expected-note{{here}} void f1(X0&); void f1(const X0&); // expected-error{{redecl}} void f2(const X0&); // expected-note{{here}} void f2(X0&); void f2(const ::X0&); // expected-error{{redecl}} }; template struct X1 { void f0(const X1&); // expected-note{{here}} void f0(X1&); void f0(const X1&); // expected-error{{redecl}} }; namespace pr6326 { template class A { friend class A; }; template class A; } namespace ForwardDecls { template struct X; template struct X { typedef T foo; typedef X xt; typename xt::foo *t; }; } namespace ConflictingRedecl { template struct Nested { template struct Nested; // expected-error {{member 'Nested' has the same name as its class}} }; }