xref: /aosp_15_r20/external/clang/test/SemaTemplate/injected-class-name.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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