annotate clang/test/SemaTemplate/current-instantiation.cpp @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -fsyntax-only -verify %s
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 // This test concerns the identity of dependent types within the
anatofuz
parents:
diff changeset
4 // canonical type system, specifically focusing on the difference
anatofuz
parents:
diff changeset
5 // between members of the current instantiation and members of an
anatofuz
parents:
diff changeset
6 // unknown specialization. This considers C++ [temp.type], which
anatofuz
parents:
diff changeset
7 // specifies type equivalence within a template, and C++0x
anatofuz
parents:
diff changeset
8 // [temp.dep.type], which defines what it means to be a member of the
anatofuz
parents:
diff changeset
9 // current instantiation.
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 template<typename T, typename U>
anatofuz
parents:
diff changeset
12 struct X0 {
anatofuz
parents:
diff changeset
13 typedef T T_type;
anatofuz
parents:
diff changeset
14 typedef U U_type;
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 void f0(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
17 void f0(typename X0::U_type&);
anatofuz
parents:
diff changeset
18 void f0(typename X0::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 void f1(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
21 void f1(typename X0::U_type&);
anatofuz
parents:
diff changeset
22 void f1(typename X0<T, U>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 void f2(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
25 void f2(typename X0::U_type&);
anatofuz
parents:
diff changeset
26 void f2(typename X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 void f3(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
29 void f3(typename X0::U_type&);
anatofuz
parents:
diff changeset
30 void f3(typename ::X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 struct X1 {
anatofuz
parents:
diff changeset
33 typedef T my_T_type;
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 void g0(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
36 void g0(typename X0::U_type&);
anatofuz
parents:
diff changeset
37 void g0(typename X0::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 void g1(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
40 void g1(typename X0::U_type&);
anatofuz
parents:
diff changeset
41 void g1(typename X0<T, U>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 void g2(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
44 void g2(typename X0::U_type&);
anatofuz
parents:
diff changeset
45 void g2(typename X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 void g3(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
48 void g3(typename X0::U_type&);
anatofuz
parents:
diff changeset
49 void g3(typename ::X0<T_type, U_type>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 void g4(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
52 void g4(typename X0::U_type&);
anatofuz
parents:
diff changeset
53 void g4(typename X1::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 void g5(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
56 void g5(typename X0::U_type&);
anatofuz
parents:
diff changeset
57 void g5(typename X0::X1::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 void g6(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
60 void g6(typename X0::U_type&);
anatofuz
parents:
diff changeset
61 void g6(typename X0<T, U>::X1::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 void g7(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
64 void g7(typename X0::U_type&);
anatofuz
parents:
diff changeset
65 void g7(typename ::X0<typename X1::my_T_type, U_type>::X1::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 void g8(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
68 void g8(typename X0<U, T_type>::T_type&);
anatofuz
parents:
diff changeset
69 void g8(typename ::X0<typename X0<T_type, U>::X1::my_T_type, U_type>::X1::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
70 };
anatofuz
parents:
diff changeset
71 };
anatofuz
parents:
diff changeset
72
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 template<typename T, typename U>
anatofuz
parents:
diff changeset
75 struct X0<T*, U*> {
anatofuz
parents:
diff changeset
76 typedef T T_type;
anatofuz
parents:
diff changeset
77 typedef U U_type;
anatofuz
parents:
diff changeset
78 typedef T* Tptr;
anatofuz
parents:
diff changeset
79 typedef U* Uptr;
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 void f0(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
82 void f0(typename X0::U_type&);
anatofuz
parents:
diff changeset
83 void f0(typename X0::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 void f1(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
86 void f1(typename X0::U_type&);
anatofuz
parents:
diff changeset
87 void f1(typename X0<T*, U*>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 void f2(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
90 void f2(typename X0::U_type&);
anatofuz
parents:
diff changeset
91 void f2(typename X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 void f3(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
94 void f3(typename X0::U_type&);
anatofuz
parents:
diff changeset
95 void f3(typename ::X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
96
anatofuz
parents:
diff changeset
97 void f4(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
98 void f4(typename X0::U_type&);
anatofuz
parents:
diff changeset
99 void f4(typename ::X0<Tptr, Uptr>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 void f5(X0*); // expected-note{{previous}}
anatofuz
parents:
diff changeset
102 void f5(::X0<T, U>*);
anatofuz
parents:
diff changeset
103 void f5(::X0<T*, U*>*); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 struct X2 {
anatofuz
parents:
diff changeset
106 typedef T my_T_type;
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 void g0(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
109 void g0(typename X0::U_type&);
anatofuz
parents:
diff changeset
110 void g0(typename X0::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
111
anatofuz
parents:
diff changeset
112 void g1(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
113 void g1(typename X0::U_type&);
anatofuz
parents:
diff changeset
114 void g1(typename X0<T*, U*>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 void g2(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
117 void g2(typename X0::U_type&);
anatofuz
parents:
diff changeset
118 void g2(typename X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 void g3(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
121 void g3(typename X0::U_type&);
anatofuz
parents:
diff changeset
122 void g3(typename ::X0<T_type*, U_type*>::T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 void g4(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
125 void g4(typename X0::U_type&);
anatofuz
parents:
diff changeset
126 void g4(typename X2::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 void g5(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
129 void g5(typename X0::U_type&);
anatofuz
parents:
diff changeset
130 void g5(typename X0::X2::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
131
anatofuz
parents:
diff changeset
132 void g6(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
133 void g6(typename X0::U_type&);
anatofuz
parents:
diff changeset
134 void g6(typename X0<T*, U*>::X2::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
135
anatofuz
parents:
diff changeset
136 void g7(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
137 void g7(typename X0::U_type&);
anatofuz
parents:
diff changeset
138 void g7(typename ::X0<typename X2::my_T_type*, U_type*>::X2::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140 void g8(T&); // expected-note{{previous}}
anatofuz
parents:
diff changeset
141 void g8(typename X0<U, T_type>::T_type&);
anatofuz
parents:
diff changeset
142 void g8(typename ::X0<typename X0<T_type*, U*>::X2::my_T_type*, U_type*>::X2::my_T_type&); // expected-error{{redecl}}
anatofuz
parents:
diff changeset
143 };
anatofuz
parents:
diff changeset
144 };
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 template<typename T>
anatofuz
parents:
diff changeset
147 struct X1 {
anatofuz
parents:
diff changeset
148 static int *a;
anatofuz
parents:
diff changeset
149 void f(float *b) {
anatofuz
parents:
diff changeset
150 X1<T>::a = b; // expected-error{{incompatible}}
anatofuz
parents:
diff changeset
151 X1<T*>::a = b;
anatofuz
parents:
diff changeset
152 }
anatofuz
parents:
diff changeset
153 };
anatofuz
parents:
diff changeset
154
anatofuz
parents:
diff changeset
155 namespace ConstantInCurrentInstantiation {
anatofuz
parents:
diff changeset
156 template<typename T>
anatofuz
parents:
diff changeset
157 struct X {
anatofuz
parents:
diff changeset
158 static const int value = 2;
anatofuz
parents:
diff changeset
159 static int array[value];
anatofuz
parents:
diff changeset
160 };
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 template<typename T> const int X<T>::value;
anatofuz
parents:
diff changeset
163
anatofuz
parents:
diff changeset
164 template<typename T>
anatofuz
parents:
diff changeset
165 int X<T>::array[X<T>::value] = { 1, 2 };
anatofuz
parents:
diff changeset
166 }
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 namespace Expressions {
anatofuz
parents:
diff changeset
169 template <bool b>
anatofuz
parents:
diff changeset
170 struct Bool {
anatofuz
parents:
diff changeset
171 enum anonymous_enum { value = b };
anatofuz
parents:
diff changeset
172 };
anatofuz
parents:
diff changeset
173 struct True : public Bool<true> {};
anatofuz
parents:
diff changeset
174 struct False : public Bool<false> {};
anatofuz
parents:
diff changeset
175
anatofuz
parents:
diff changeset
176 template <typename T1, typename T2>
anatofuz
parents:
diff changeset
177 struct Is_Same : public False {};
anatofuz
parents:
diff changeset
178 template <typename T>
anatofuz
parents:
diff changeset
179 struct Is_Same<T, T> : public True {};
anatofuz
parents:
diff changeset
180
anatofuz
parents:
diff changeset
181 template <bool b, typename T = void>
anatofuz
parents:
diff changeset
182 struct Enable_If {};
anatofuz
parents:
diff changeset
183 template <typename T>
anatofuz
parents:
diff changeset
184 struct Enable_If<true, T> {
anatofuz
parents:
diff changeset
185 typedef T type;
anatofuz
parents:
diff changeset
186 };
anatofuz
parents:
diff changeset
187
anatofuz
parents:
diff changeset
188 template <typename T>
anatofuz
parents:
diff changeset
189 class Class {
anatofuz
parents:
diff changeset
190 public:
anatofuz
parents:
diff changeset
191 template <typename U>
anatofuz
parents:
diff changeset
192 typename Enable_If<Is_Same<U, Class>::value, void>::type
anatofuz
parents:
diff changeset
193 foo();
anatofuz
parents:
diff changeset
194 };
anatofuz
parents:
diff changeset
195
anatofuz
parents:
diff changeset
196
anatofuz
parents:
diff changeset
197 template <typename T>
anatofuz
parents:
diff changeset
198 template <typename U>
anatofuz
parents:
diff changeset
199 typename Enable_If<Is_Same<U, Class<T> >::value, void>::type
anatofuz
parents:
diff changeset
200 Class<T>::foo() {}
anatofuz
parents:
diff changeset
201 }
anatofuz
parents:
diff changeset
202
anatofuz
parents:
diff changeset
203 namespace PR9255 {
anatofuz
parents:
diff changeset
204 template<typename T>
anatofuz
parents:
diff changeset
205 class X0 {
anatofuz
parents:
diff changeset
206 public:
anatofuz
parents:
diff changeset
207 class Inner1;
anatofuz
parents:
diff changeset
208
anatofuz
parents:
diff changeset
209 class Inner2 {
anatofuz
parents:
diff changeset
210 public:
anatofuz
parents:
diff changeset
211 void f()
anatofuz
parents:
diff changeset
212 {
anatofuz
parents:
diff changeset
213 Inner1::f.g();
anatofuz
parents:
diff changeset
214 }
anatofuz
parents:
diff changeset
215 };
anatofuz
parents:
diff changeset
216 };
anatofuz
parents:
diff changeset
217 }
anatofuz
parents:
diff changeset
218
anatofuz
parents:
diff changeset
219 namespace rdar10194295 {
anatofuz
parents:
diff changeset
220 template<typename XT>
anatofuz
parents:
diff changeset
221 class X {
anatofuz
parents:
diff changeset
222 public:
anatofuz
parents:
diff changeset
223 enum Enum { Yes, No };
anatofuz
parents:
diff changeset
224 template<Enum> void foo();
anatofuz
parents:
diff changeset
225 template<Enum> class Inner;
anatofuz
parents:
diff changeset
226 };
anatofuz
parents:
diff changeset
227
anatofuz
parents:
diff changeset
228 template<typename XT>
anatofuz
parents:
diff changeset
229 template<typename X<XT>::Enum>
anatofuz
parents:
diff changeset
230 void X<XT>::foo()
anatofuz
parents:
diff changeset
231 {
anatofuz
parents:
diff changeset
232 }
anatofuz
parents:
diff changeset
233
anatofuz
parents:
diff changeset
234 template<typename XT>
anatofuz
parents:
diff changeset
235 template<typename X<XT>::Enum>
anatofuz
parents:
diff changeset
236 class X<XT>::Inner { };
anatofuz
parents:
diff changeset
237 }
anatofuz
parents:
diff changeset
238
anatofuz
parents:
diff changeset
239 namespace RebuildDependentScopeDeclRefExpr {
anatofuz
parents:
diff changeset
240 template<int> struct N {};
anatofuz
parents:
diff changeset
241 template<typename T> struct X {
anatofuz
parents:
diff changeset
242 static const int thing = 0;
anatofuz
parents:
diff changeset
243 N<thing> data();
anatofuz
parents:
diff changeset
244 N<thing> foo();
anatofuz
parents:
diff changeset
245 };
anatofuz
parents:
diff changeset
246 template<typename T> N<X<T>::thing> X<T>::data() {}
anatofuz
parents:
diff changeset
247 // FIXME: We should issue a typo-correction here.
anatofuz
parents:
diff changeset
248 template<typename T> N<X<T>::think> X<T>::foo() {} // expected-error {{no member named 'think' in 'X<T>'}}
anatofuz
parents:
diff changeset
249 }