xref: /llvm-project/clang/test/SemaTemplate/injected-class-name.cpp (revision 74f02347ca163e6d7bbd737ec8c3511f4185f7ea)
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 Smith void 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