18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s 297f1f1c4SDouglas Gregor template<typename T> 397f1f1c4SDouglas Gregor struct X { 497f1f1c4SDouglas Gregor X<T*> *ptr; 597f1f1c4SDouglas Gregor }; 697f1f1c4SDouglas Gregor 797f1f1c4SDouglas Gregor X<int> x; 897f1f1c4SDouglas Gregor 997f1f1c4SDouglas Gregor template<> 1097f1f1c4SDouglas Gregor struct X<int***> { 1197f1f1c4SDouglas Gregor typedef X<int***> *ptr; 1297f1f1c4SDouglas Gregor }; 1397f1f1c4SDouglas Gregor 14*74f02347SRichard Smith X<float>::X<int> xi = x; // expected-error{{qualified reference to 'X' is a constructor name rather than a template name}} f()15*74f02347SRichard Smithvoid f() { 16*74f02347SRichard Smith X<float>::X<int> xi = x; // expected-error{{qualified reference to 'X' is a constructor name rather than a template name}} 17*74f02347SRichard Smith } 18e362cea5SDouglas Gregor 19e362cea5SDouglas Gregor // [temp.local]p1: 20e362cea5SDouglas Gregor 210004417eSDouglas Gregor // FIXME: test template template parameters 22e362cea5SDouglas Gregor template<typename T, typename U> 23e362cea5SDouglas Gregor struct X0 { 24e362cea5SDouglas Gregor typedef T type; 25e362cea5SDouglas Gregor typedef U U_type; 26e362cea5SDouglas Gregor typedef U_type U_type2; 27e362cea5SDouglas Gregor 28e362cea5SDouglas Gregor void f0(const X0&); // expected-note{{here}} 29e362cea5SDouglas Gregor void f0(X0&); 30e362cea5SDouglas Gregor void f0(const X0<T, U>&); // expected-error{{redecl}} 31e362cea5SDouglas Gregor 32e362cea5SDouglas Gregor void f1(const X0&); // expected-note{{here}} 33e362cea5SDouglas Gregor void f1(X0&); 34e362cea5SDouglas Gregor void f1(const X0<type, U_type2>&); // expected-error{{redecl}} 35e362cea5SDouglas Gregor 36e362cea5SDouglas Gregor void f2(const X0&); // expected-note{{here}} 37e362cea5SDouglas Gregor void f2(X0&); 38e362cea5SDouglas Gregor void f2(const ::X0<type, U_type2>&); // expected-error{{redecl}} 39e362cea5SDouglas Gregor }; 400004417eSDouglas Gregor 410004417eSDouglas Gregor template<typename T, T N> 420004417eSDouglas Gregor struct X1 { 430004417eSDouglas Gregor void f0(const X1&); // expected-note{{here}} 440004417eSDouglas Gregor void f0(X1&); 450004417eSDouglas Gregor void f0(const X1<T, N>&); // expected-error{{redecl}} 460004417eSDouglas Gregor }; 470004417eSDouglas Gregor 48e78aac41SJohn McCall namespace pr6326 { 49e78aac41SJohn McCall template <class T> class A { 50e78aac41SJohn McCall friend class A; 51e78aac41SJohn McCall }; 52e78aac41SJohn McCall template class A<int>; 53e78aac41SJohn McCall } 541e13c5a8SDouglas Gregor 551e13c5a8SDouglas Gregor namespace ForwardDecls { 561e13c5a8SDouglas Gregor template<typename T> 571e13c5a8SDouglas Gregor struct X; 581e13c5a8SDouglas Gregor 591e13c5a8SDouglas Gregor template<typename T> 601e13c5a8SDouglas Gregor struct X { 611e13c5a8SDouglas Gregor typedef T foo; 621e13c5a8SDouglas Gregor typedef X<T> xt; 631e13c5a8SDouglas Gregor typename xt::foo *t; 641e13c5a8SDouglas Gregor }; 651e13c5a8SDouglas Gregor } 6688fe69ceSRichard Smith 6788fe69ceSRichard Smith namespace ConflictingRedecl { 6888fe69ceSRichard Smith template<typename> struct Nested { 6988fe69ceSRichard Smith template<typename> struct Nested; // expected-error {{member 'Nested' has the same name as its class}} 7088fe69ceSRichard Smith }; 7188fe69ceSRichard Smith } 72