]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaTemplate/current-instantiation.cpp
Update clang to r94309.
[FreeBSD/FreeBSD.git] / test / SemaTemplate / current-instantiation.cpp
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2
3 // This test concerns the identity of dependent types within the
4 // canonical type system, specifically focusing on the difference
5 // between members of the current instantiation and membmers of an
6 // unknown specialization. This considers C++ [temp.type], which
7 // specifies type equivalence within a template, and C++0x
8 // [temp.dep.type], which defines what it means to be a member of the
9 // current instantiation.
10
11 template<typename T, typename U>
12 struct X0 {
13   typedef T T_type;
14   typedef U U_type;
15
16   void f0(T&); // expected-note{{previous}}
17   void f0(typename X0::U_type&);
18   void f0(typename X0::T_type&); // expected-error{{redecl}}
19
20   void f1(T&); // expected-note{{previous}}
21   void f1(typename X0::U_type&);
22   void f1(typename X0<T, U>::T_type&); // expected-error{{redecl}}
23
24   void f2(T&); // expected-note{{previous}}
25   void f2(typename X0::U_type&);
26   void f2(typename X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
27
28   void f3(T&); // expected-note{{previous}}
29   void f3(typename X0::U_type&);
30   void f3(typename ::X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
31
32   struct X1 {
33     typedef T my_T_type;
34
35     void g0(T&); // expected-note{{previous}}
36     void g0(typename X0::U_type&);
37     void g0(typename X0::T_type&); // expected-error{{redecl}}
38
39     void g1(T&); // expected-note{{previous}}
40     void g1(typename X0::U_type&);
41     void g1(typename X0<T, U>::T_type&); // expected-error{{redecl}}
42     
43     void g2(T&); // expected-note{{previous}}
44     void g2(typename X0::U_type&);
45     void g2(typename X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
46     
47     void g3(T&); // expected-note{{previous}}
48     void g3(typename X0::U_type&);
49     void g3(typename ::X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
50
51     void g4(T&); // expected-note{{previous}}
52     void g4(typename X0::U_type&);
53     void g4(typename X1::my_T_type&); // expected-error{{redecl}}
54
55     void g5(T&); // expected-note{{previous}}
56     void g5(typename X0::U_type&);
57     void g5(typename X0::X1::my_T_type&); // expected-error{{redecl}}
58
59     void g6(T&); // expected-note{{previous}}
60     void g6(typename X0::U_type&);
61     void g6(typename X0<T, U>::X1::my_T_type&); // expected-error{{redecl}}
62
63     void g7(T&); // expected-note{{previous}}
64     void g7(typename X0::U_type&);
65     void g7(typename ::X0<typename X1::my_T_type, U_type>::X1::my_T_type&); // expected-error{{redecl}}
66
67     void g8(T&); // expected-note{{previous}}
68     void g8(typename X0<U, T_type>::T_type&);
69     void g8(typename ::X0<typename X0<T_type, U>::X1::my_T_type, U_type>::X1::my_T_type&); // expected-error{{redecl}}
70   };
71 };
72
73
74 template<typename T, typename U>
75 struct X0<T*, U*> {
76   typedef T T_type;
77   typedef U U_type;
78   typedef T* Tptr;
79   typedef U* Uptr;
80   
81   void f0(T&); // expected-note{{previous}}
82   void f0(typename X0::U_type&);
83   void f0(typename X0::T_type&); // expected-error{{redecl}}
84   
85   void f1(T&); // expected-note{{previous}}
86   void f1(typename X0::U_type&);
87   void f1(typename X0<T*, U*>::T_type&); // expected-error{{redecl}}
88   
89   void f2(T&); // expected-note{{previous}}
90   void f2(typename X0::U_type&);
91   void f2(typename X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
92   
93   void f3(T&); // expected-note{{previous}}
94   void f3(typename X0::U_type&);
95   void f3(typename ::X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
96
97   void f4(T&); // expected-note{{previous}}
98   void f4(typename X0::U_type&);
99   void f4(typename ::X0<Tptr, Uptr>::T_type&); // expected-error{{redecl}}
100   
101   void f5(X0*); // expected-note{{previous}}
102   void f5(::X0<T, U>*);
103   void f5(::X0<T*, U*>*); // expected-error{{redecl}}
104   
105   struct X2 {
106     typedef T my_T_type;
107     
108     void g0(T&); // expected-note{{previous}}
109     void g0(typename X0::U_type&);
110     void g0(typename X0::T_type&); // expected-error{{redecl}}
111     
112     void g1(T&); // expected-note{{previous}}
113     void g1(typename X0::U_type&);
114     void g1(typename X0<T*, U*>::T_type&); // expected-error{{redecl}}
115     
116     void g2(T&); // expected-note{{previous}}
117     void g2(typename X0::U_type&);
118     void g2(typename X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
119     
120     void g3(T&); // expected-note{{previous}}
121     void g3(typename X0::U_type&);
122     void g3(typename ::X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
123     
124     void g4(T&); // expected-note{{previous}}
125     void g4(typename X0::U_type&);
126     void g4(typename X2::my_T_type&); // expected-error{{redecl}}
127     
128     void g5(T&); // expected-note{{previous}}
129     void g5(typename X0::U_type&);
130     void g5(typename X0::X2::my_T_type&); // expected-error{{redecl}}
131     
132     void g6(T&); // expected-note{{previous}}
133     void g6(typename X0::U_type&);
134     void g6(typename X0<T*, U*>::X2::my_T_type&); // expected-error{{redecl}}
135     
136     void g7(T&); // expected-note{{previous}}
137     void g7(typename X0::U_type&);
138     void g7(typename ::X0<typename X2::my_T_type*, U_type*>::X2::my_T_type&); // expected-error{{redecl}}
139     
140     void g8(T&); // expected-note{{previous}}
141     void g8(typename X0<U, T_type>::T_type&);
142     void g8(typename ::X0<typename X0<T_type*, U*>::X2::my_T_type*, U_type*>::X2::my_T_type&); // expected-error{{redecl}}
143   };
144 };
145
146 template<typename T>
147 struct X1 {
148   static int *a;
149   void f(float *b) {
150     X1<T>::a = b; // expected-error{{incompatible}}
151     X1<T*>::a = b;
152   }
153 };