annotate clang/test/SemaTemplate/instantiate-local-class.cpp @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 0572611fdcc8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -verify -std=c++11 %s
anatofuz
parents:
diff changeset
2 // RUN: %clang_cc1 -verify -std=c++11 -fdelayed-template-parsing %s
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 template<typename T>
anatofuz
parents:
diff changeset
5 void f0() {
anatofuz
parents:
diff changeset
6 struct X;
anatofuz
parents:
diff changeset
7 typedef struct Y {
anatofuz
parents:
diff changeset
8 T (X::* f1())(int) { return 0; }
anatofuz
parents:
diff changeset
9 } Y2;
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 Y2 y = Y();
anatofuz
parents:
diff changeset
12 }
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 template void f0<int>();
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 // PR5764
anatofuz
parents:
diff changeset
17 namespace PR5764 {
anatofuz
parents:
diff changeset
18 struct X {
anatofuz
parents:
diff changeset
19 template <typename T>
anatofuz
parents:
diff changeset
20 void Bar() {
anatofuz
parents:
diff changeset
21 typedef T ValueType;
anatofuz
parents:
diff changeset
22 struct Y {
anatofuz
parents:
diff changeset
23 Y() { V = ValueType(); }
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 ValueType V;
anatofuz
parents:
diff changeset
26 };
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 Y y;
anatofuz
parents:
diff changeset
29 }
anatofuz
parents:
diff changeset
30 };
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 void test(X x) {
anatofuz
parents:
diff changeset
33 x.Bar<int>();
anatofuz
parents:
diff changeset
34 }
anatofuz
parents:
diff changeset
35 }
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 // Instantiation of local classes with virtual functions.
anatofuz
parents:
diff changeset
38 namespace local_class_with_virtual_functions {
anatofuz
parents:
diff changeset
39 template <typename T> struct X { };
anatofuz
parents:
diff changeset
40 template <typename T> struct Y { };
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 template <typename T>
anatofuz
parents:
diff changeset
43 void f() {
anatofuz
parents:
diff changeset
44 struct Z : public X<Y<T>*> {
anatofuz
parents:
diff changeset
45 virtual void g(Y<T>* y) { }
anatofuz
parents:
diff changeset
46 void g2(int x) {(void)x;}
anatofuz
parents:
diff changeset
47 };
anatofuz
parents:
diff changeset
48 Z z;
anatofuz
parents:
diff changeset
49 (void)z;
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 struct S { };
anatofuz
parents:
diff changeset
53 void test() { f<S>(); }
anatofuz
parents:
diff changeset
54 }
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 namespace PR8801 {
anatofuz
parents:
diff changeset
57 template<typename T>
anatofuz
parents:
diff changeset
58 void foo() {
anatofuz
parents:
diff changeset
59 class X;
anatofuz
parents:
diff changeset
60 typedef int (X::*pmf_type)();
anatofuz
parents:
diff changeset
61 class X : public T { };
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 pmf_type pmf = &T::foo;
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 struct Y { int foo(); };
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 template void foo<Y>();
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 namespace TemplatePacksAndLambdas {
anatofuz
parents:
diff changeset
72 template <typename ...T> int g(T...);
anatofuz
parents:
diff changeset
73 struct S {
anatofuz
parents:
diff changeset
74 template <typename ...T> static void f(int f = g([]{ static T t; return ++t; }()...)) {}
anatofuz
parents:
diff changeset
75 };
anatofuz
parents:
diff changeset
76 void h() { S::f<int, int, int>(); }
anatofuz
parents:
diff changeset
77 }
anatofuz
parents:
diff changeset
78
anatofuz
parents:
diff changeset
79 namespace PR9685 {
anatofuz
parents:
diff changeset
80 template <class Thing> void forEach(Thing t) { t.func(); }
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 template <typename T> void doIt() {
anatofuz
parents:
diff changeset
83 struct Functor {
anatofuz
parents:
diff changeset
84 void func() { (void)i; }
anatofuz
parents:
diff changeset
85 int i;
anatofuz
parents:
diff changeset
86 };
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 forEach(Functor());
anatofuz
parents:
diff changeset
89 }
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 void call() {
anatofuz
parents:
diff changeset
92 doIt<int>();
anatofuz
parents:
diff changeset
93 }
anatofuz
parents:
diff changeset
94 }
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 namespace PR12702 {
anatofuz
parents:
diff changeset
97 struct S {
anatofuz
parents:
diff changeset
98 template <typename F> bool apply(F f) { return f(); }
anatofuz
parents:
diff changeset
99 };
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 template <typename> struct T {
anatofuz
parents:
diff changeset
102 void foo() {
anatofuz
parents:
diff changeset
103 struct F {
anatofuz
parents:
diff changeset
104 int x;
anatofuz
parents:
diff changeset
105
anatofuz
parents:
diff changeset
106 bool operator()() { return x == 0; }
anatofuz
parents:
diff changeset
107 };
anatofuz
parents:
diff changeset
108
anatofuz
parents:
diff changeset
109 S().apply(F());
anatofuz
parents:
diff changeset
110 }
anatofuz
parents:
diff changeset
111 };
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 void call() { T<int>().foo(); }
anatofuz
parents:
diff changeset
114 }
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 namespace PR17139 {
anatofuz
parents:
diff changeset
117 template <class T> void foo(const T &t) { t.foo(); }
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 template <class F> void bar(F *f) {
anatofuz
parents:
diff changeset
120 struct B {
anatofuz
parents:
diff changeset
121 F *fn;
anatofuz
parents:
diff changeset
122 void foo() const { fn(); }
anatofuz
parents:
diff changeset
123 } b = { f };
anatofuz
parents:
diff changeset
124 foo(b);
anatofuz
parents:
diff changeset
125 }
anatofuz
parents:
diff changeset
126
anatofuz
parents:
diff changeset
127 void go() {}
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 void test() { bar(go); }
anatofuz
parents:
diff changeset
130 }
anatofuz
parents:
diff changeset
131
anatofuz
parents:
diff changeset
132 namespace PR17740 {
anatofuz
parents:
diff changeset
133 class C {
anatofuz
parents:
diff changeset
134 public:
anatofuz
parents:
diff changeset
135 template <typename T> static void foo(T function);
anatofuz
parents:
diff changeset
136 template <typename T> static void bar(T function);
anatofuz
parents:
diff changeset
137 template <typename T> static void func(T function);
anatofuz
parents:
diff changeset
138 };
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140 template <typename T> void C::foo(T function) { function(); }
anatofuz
parents:
diff changeset
141
anatofuz
parents:
diff changeset
142 template <typename T> void C::bar(T function) {
anatofuz
parents:
diff changeset
143 foo([&function]() { function(); });
anatofuz
parents:
diff changeset
144 }
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 template <typename T> void C::func(T function) {
anatofuz
parents:
diff changeset
147 struct Struct {
anatofuz
parents:
diff changeset
148 T mFunction;
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 Struct(T function) : mFunction(function) {};
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152 void operator()() {
anatofuz
parents:
diff changeset
153 mFunction();
anatofuz
parents:
diff changeset
154 };
anatofuz
parents:
diff changeset
155 };
anatofuz
parents:
diff changeset
156
anatofuz
parents:
diff changeset
157 bar(Struct(function));
anatofuz
parents:
diff changeset
158 }
anatofuz
parents:
diff changeset
159
anatofuz
parents:
diff changeset
160 void call() {
anatofuz
parents:
diff changeset
161 C::func([]() {});
anatofuz
parents:
diff changeset
162 }
anatofuz
parents:
diff changeset
163 }
anatofuz
parents:
diff changeset
164
anatofuz
parents:
diff changeset
165 namespace PR14373 {
anatofuz
parents:
diff changeset
166 struct function {
anatofuz
parents:
diff changeset
167 template <typename _Functor> function(_Functor __f) { __f(); }
anatofuz
parents:
diff changeset
168 };
anatofuz
parents:
diff changeset
169 template <typename Func> function exec_func(Func f) {
anatofuz
parents:
diff changeset
170 struct functor {
anatofuz
parents:
diff changeset
171 functor(Func f) : func(f) {}
anatofuz
parents:
diff changeset
172 void operator()() const { func(); }
anatofuz
parents:
diff changeset
173 Func func;
anatofuz
parents:
diff changeset
174 };
anatofuz
parents:
diff changeset
175 return functor(f);
anatofuz
parents:
diff changeset
176 }
anatofuz
parents:
diff changeset
177 struct Type {
anatofuz
parents:
diff changeset
178 void operator()() const {}
anatofuz
parents:
diff changeset
179 };
anatofuz
parents:
diff changeset
180 int call() {
anatofuz
parents:
diff changeset
181 exec_func(Type());
anatofuz
parents:
diff changeset
182 return 0;
anatofuz
parents:
diff changeset
183 }
anatofuz
parents:
diff changeset
184 }
anatofuz
parents:
diff changeset
185
anatofuz
parents:
diff changeset
186 namespace PR18907 {
anatofuz
parents:
diff changeset
187 template <typename>
anatofuz
parents:
diff changeset
188 class C : public C<int> {}; // expected-error{{within its own definition}}
anatofuz
parents:
diff changeset
189
anatofuz
parents:
diff changeset
190 template <typename X>
anatofuz
parents:
diff changeset
191 void F() {
anatofuz
parents:
diff changeset
192 struct A : C<X> {};
anatofuz
parents:
diff changeset
193 }
anatofuz
parents:
diff changeset
194
anatofuz
parents:
diff changeset
195 struct B {
anatofuz
parents:
diff changeset
196 void f() { F<int>(); }
anatofuz
parents:
diff changeset
197 };
anatofuz
parents:
diff changeset
198 }
anatofuz
parents:
diff changeset
199
anatofuz
parents:
diff changeset
200 namespace PR23194 {
anatofuz
parents:
diff changeset
201 struct X {
anatofuz
parents:
diff changeset
202 int operator()() const { return 0; }
anatofuz
parents:
diff changeset
203 };
anatofuz
parents:
diff changeset
204 struct Y {
anatofuz
parents:
diff changeset
205 Y(int) {}
anatofuz
parents:
diff changeset
206 };
anatofuz
parents:
diff changeset
207 template <bool = true> int make_seed_pair() noexcept {
anatofuz
parents:
diff changeset
208 struct state_t {
anatofuz
parents:
diff changeset
209 X x;
anatofuz
parents:
diff changeset
210 Y y{x()};
anatofuz
parents:
diff changeset
211 };
anatofuz
parents:
diff changeset
212 return 0;
anatofuz
parents:
diff changeset
213 }
anatofuz
parents:
diff changeset
214 int func() {
anatofuz
parents:
diff changeset
215 return make_seed_pair();
anatofuz
parents:
diff changeset
216 }
anatofuz
parents:
diff changeset
217 }
anatofuz
parents:
diff changeset
218
anatofuz
parents:
diff changeset
219 namespace PR18653 {
anatofuz
parents:
diff changeset
220 // Forward declarations
anatofuz
parents:
diff changeset
221
anatofuz
parents:
diff changeset
222 template<typename T> void f1() {
anatofuz
parents:
diff changeset
223 void g1(struct x1);
anatofuz
parents:
diff changeset
224 struct x1 {};
anatofuz
parents:
diff changeset
225 }
anatofuz
parents:
diff changeset
226 template void f1<int>();
anatofuz
parents:
diff changeset
227
anatofuz
parents:
diff changeset
228 template<typename T> void f1a() {
anatofuz
parents:
diff changeset
229 void g1(union x1);
anatofuz
parents:
diff changeset
230 union x1 {};
anatofuz
parents:
diff changeset
231 }
anatofuz
parents:
diff changeset
232 template void f1a<int>();
anatofuz
parents:
diff changeset
233
anatofuz
parents:
diff changeset
234 template<typename T> void f2() {
anatofuz
parents:
diff changeset
235 void g2(enum x2); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
anatofuz
parents:
diff changeset
236 enum x2 { nothing };
anatofuz
parents:
diff changeset
237 }
anatofuz
parents:
diff changeset
238 template void f2<int>();
anatofuz
parents:
diff changeset
239
anatofuz
parents:
diff changeset
240 template<typename T> void f3() {
anatofuz
parents:
diff changeset
241 void g3(enum class x3);
anatofuz
parents:
diff changeset
242 enum class x3 { nothing };
anatofuz
parents:
diff changeset
243 }
anatofuz
parents:
diff changeset
244 template void f3<int>();
anatofuz
parents:
diff changeset
245
anatofuz
parents:
diff changeset
246
anatofuz
parents:
diff changeset
247 template<typename T> void f4() {
anatofuz
parents:
diff changeset
248 void g4(struct x4 {} x); // expected-error{{'x4' cannot be defined in a parameter type}}
anatofuz
parents:
diff changeset
249 }
anatofuz
parents:
diff changeset
250 template void f4<int>();
anatofuz
parents:
diff changeset
251
anatofuz
parents:
diff changeset
252 template<typename T> void f4a() {
anatofuz
parents:
diff changeset
253 void g4(union x4 {} x); // expected-error{{'x4' cannot be defined in a parameter type}}
anatofuz
parents:
diff changeset
254 }
anatofuz
parents:
diff changeset
255 template void f4a<int>();
anatofuz
parents:
diff changeset
256
anatofuz
parents:
diff changeset
257
anatofuz
parents:
diff changeset
258 template <class T> void f();
anatofuz
parents:
diff changeset
259 template <class T> struct S1 {
anatofuz
parents:
diff changeset
260 void m() {
anatofuz
parents:
diff changeset
261 f<class newclass>();
anatofuz
parents:
diff changeset
262 f<union newunion>();
anatofuz
parents:
diff changeset
263 }
anatofuz
parents:
diff changeset
264 };
anatofuz
parents:
diff changeset
265 template struct S1<int>;
anatofuz
parents:
diff changeset
266
anatofuz
parents:
diff changeset
267 template <class T> struct S2 {
anatofuz
parents:
diff changeset
268 void m() {
anatofuz
parents:
diff changeset
269 f<enum new_enum>(); // expected-error{{ISO C++ forbids forward references to 'enum' types}}
anatofuz
parents:
diff changeset
270 }
anatofuz
parents:
diff changeset
271 };
anatofuz
parents:
diff changeset
272 template struct S2<int>;
anatofuz
parents:
diff changeset
273
anatofuz
parents:
diff changeset
274 template <class T> struct S3 {
anatofuz
parents:
diff changeset
275 void m() {
anatofuz
parents:
diff changeset
276 f<enum class new_enum>();
anatofuz
parents:
diff changeset
277 }
anatofuz
parents:
diff changeset
278 };
anatofuz
parents:
diff changeset
279 template struct S3<int>;
anatofuz
parents:
diff changeset
280
anatofuz
parents:
diff changeset
281 template <class T> struct S4 {
anatofuz
parents:
diff changeset
282 struct local {};
anatofuz
parents:
diff changeset
283 void m() {
anatofuz
parents:
diff changeset
284 f<local>();
anatofuz
parents:
diff changeset
285 }
anatofuz
parents:
diff changeset
286 };
anatofuz
parents:
diff changeset
287 template struct S4<int>;
anatofuz
parents:
diff changeset
288
anatofuz
parents:
diff changeset
289 template <class T> struct S4a {
anatofuz
parents:
diff changeset
290 union local {};
anatofuz
parents:
diff changeset
291 void m() {
anatofuz
parents:
diff changeset
292 f<local>();
anatofuz
parents:
diff changeset
293 }
anatofuz
parents:
diff changeset
294 };
anatofuz
parents:
diff changeset
295 template struct S4a<int>;
anatofuz
parents:
diff changeset
296
anatofuz
parents:
diff changeset
297 template <class T> struct S5 {
anatofuz
parents:
diff changeset
298 enum local { nothing };
anatofuz
parents:
diff changeset
299 void m() {
anatofuz
parents:
diff changeset
300 f<local>();
anatofuz
parents:
diff changeset
301 }
anatofuz
parents:
diff changeset
302 };
anatofuz
parents:
diff changeset
303 template struct S5<int>;
anatofuz
parents:
diff changeset
304
anatofuz
parents:
diff changeset
305 template <class T> struct S7 {
anatofuz
parents:
diff changeset
306 enum class local { nothing };
anatofuz
parents:
diff changeset
307 void m() {
anatofuz
parents:
diff changeset
308 f<local>();
anatofuz
parents:
diff changeset
309 }
anatofuz
parents:
diff changeset
310 };
anatofuz
parents:
diff changeset
311 template struct S7<int>;
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313
anatofuz
parents:
diff changeset
314 template <class T> void fff(T *x);
anatofuz
parents:
diff changeset
315 template <class T> struct S01 {
anatofuz
parents:
diff changeset
316 struct local { };
anatofuz
parents:
diff changeset
317 void m() {
anatofuz
parents:
diff changeset
318 local x;
anatofuz
parents:
diff changeset
319 fff(&x);
anatofuz
parents:
diff changeset
320 }
anatofuz
parents:
diff changeset
321 };
anatofuz
parents:
diff changeset
322 template struct S01<int>;
anatofuz
parents:
diff changeset
323
anatofuz
parents:
diff changeset
324 template <class T> struct S01a {
anatofuz
parents:
diff changeset
325 union local { };
anatofuz
parents:
diff changeset
326 void m() {
anatofuz
parents:
diff changeset
327 local x;
anatofuz
parents:
diff changeset
328 fff(&x);
anatofuz
parents:
diff changeset
329 }
anatofuz
parents:
diff changeset
330 };
anatofuz
parents:
diff changeset
331 template struct S01a<int>;
anatofuz
parents:
diff changeset
332
anatofuz
parents:
diff changeset
333 template <class T> struct S02 {
anatofuz
parents:
diff changeset
334 enum local { nothing };
anatofuz
parents:
diff changeset
335 void m() {
anatofuz
parents:
diff changeset
336 local x;
anatofuz
parents:
diff changeset
337 fff(&x);
anatofuz
parents:
diff changeset
338 }
anatofuz
parents:
diff changeset
339 };
anatofuz
parents:
diff changeset
340 template struct S02<int>;
anatofuz
parents:
diff changeset
341
anatofuz
parents:
diff changeset
342 template <class T> struct S03 {
anatofuz
parents:
diff changeset
343 enum class local { nothing };
anatofuz
parents:
diff changeset
344 void m() {
anatofuz
parents:
diff changeset
345 local x;
anatofuz
parents:
diff changeset
346 fff(&x);
anatofuz
parents:
diff changeset
347 }
anatofuz
parents:
diff changeset
348 };
anatofuz
parents:
diff changeset
349 template struct S03<int>;
anatofuz
parents:
diff changeset
350
anatofuz
parents:
diff changeset
351
anatofuz
parents:
diff changeset
352 template <class T> struct S04 {
anatofuz
parents:
diff changeset
353 void m() {
anatofuz
parents:
diff changeset
354 struct { } x;
anatofuz
parents:
diff changeset
355 fff(&x);
anatofuz
parents:
diff changeset
356 }
anatofuz
parents:
diff changeset
357 };
anatofuz
parents:
diff changeset
358 template struct S04<int>;
anatofuz
parents:
diff changeset
359
anatofuz
parents:
diff changeset
360 template <class T> struct S04a {
anatofuz
parents:
diff changeset
361 void m() {
anatofuz
parents:
diff changeset
362 union { } x;
anatofuz
parents:
diff changeset
363 fff(&x);
anatofuz
parents:
diff changeset
364 }
anatofuz
parents:
diff changeset
365 };
anatofuz
parents:
diff changeset
366 template struct S04a<int>;
anatofuz
parents:
diff changeset
367
anatofuz
parents:
diff changeset
368 template <class T> struct S05 {
anatofuz
parents:
diff changeset
369 void m() {
anatofuz
parents:
diff changeset
370 enum { nothing } x;
anatofuz
parents:
diff changeset
371 fff(&x);
anatofuz
parents:
diff changeset
372 }
anatofuz
parents:
diff changeset
373 };
anatofuz
parents:
diff changeset
374 template struct S05<int>;
anatofuz
parents:
diff changeset
375
anatofuz
parents:
diff changeset
376 template <class T> struct S06 {
anatofuz
parents:
diff changeset
377 void m() {
anatofuz
parents:
diff changeset
378 class { virtual void mmm() {} } x;
anatofuz
parents:
diff changeset
379 fff(&x);
anatofuz
parents:
diff changeset
380 }
anatofuz
parents:
diff changeset
381 };
anatofuz
parents:
diff changeset
382 template struct S06<int>;
anatofuz
parents:
diff changeset
383 }
anatofuz
parents:
diff changeset
384
anatofuz
parents:
diff changeset
385 namespace PR20625 {
anatofuz
parents:
diff changeset
386 template <typename T>
anatofuz
parents:
diff changeset
387 void f() {
anatofuz
parents:
diff changeset
388 struct N {
anatofuz
parents:
diff changeset
389 static constexpr int get() { return 42; }
anatofuz
parents:
diff changeset
390 };
anatofuz
parents:
diff changeset
391 constexpr int n = N::get();
anatofuz
parents:
diff changeset
392 static_assert(n == 42, "n == 42");
anatofuz
parents:
diff changeset
393 }
anatofuz
parents:
diff changeset
394
anatofuz
parents:
diff changeset
395 void g() { f<void>(); }
anatofuz
parents:
diff changeset
396 }
anatofuz
parents:
diff changeset
397
anatofuz
parents:
diff changeset
398
anatofuz
parents:
diff changeset
399 namespace PR21332 {
anatofuz
parents:
diff changeset
400 template<typename T> void f1() {
anatofuz
parents:
diff changeset
401 struct S { // expected-note{{in instantiation of member class 'S' requested here}}
anatofuz
parents:
diff changeset
402 void g1(int n = T::error); // expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
anatofuz
parents:
diff changeset
403 };
anatofuz
parents:
diff changeset
404 }
anatofuz
parents:
diff changeset
405 template void f1<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f1<int>' requested here}}
anatofuz
parents:
diff changeset
406
anatofuz
parents:
diff changeset
407 template<typename T> void f2() {
anatofuz
parents:
diff changeset
408 struct S { // expected-note{{in instantiation of member class 'S' requested here}}
anatofuz
parents:
diff changeset
409 void g2() noexcept(T::error); // expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
anatofuz
parents:
diff changeset
410 };
anatofuz
parents:
diff changeset
411 }
anatofuz
parents:
diff changeset
412 template void f2<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f2<int>' requested here}}
anatofuz
parents:
diff changeset
413
anatofuz
parents:
diff changeset
414 template<typename T> void f3() {
anatofuz
parents:
diff changeset
415 enum S {
anatofuz
parents:
diff changeset
416 val = T::error; // expected-error{{expected '}' or ','}} expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
anatofuz
parents:
diff changeset
417 };
anatofuz
parents:
diff changeset
418 }
anatofuz
parents:
diff changeset
419 template void f3<int>(); //expected-note{{in instantiation of function template specialization 'PR21332::f3<int>' requested here}}
anatofuz
parents:
diff changeset
420
anatofuz
parents:
diff changeset
421 template<typename T> void f4() {
anatofuz
parents:
diff changeset
422 enum class S {
anatofuz
parents:
diff changeset
423 val = T::error; // expected-error{{expected '}' or ','}} expected-error{{type 'int' cannot be used prior to '::' because it has no members}}
anatofuz
parents:
diff changeset
424 };
anatofuz
parents:
diff changeset
425 }
anatofuz
parents:
diff changeset
426 template void f4<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f4<int>' requested here}}
anatofuz
parents:
diff changeset
427
anatofuz
parents:
diff changeset
428 template<typename T> void f5() {
anatofuz
parents:
diff changeset
429 class S { // expected-note {{in instantiation of default member initializer 'PR21332::f5()::S::val' requested here}}
anatofuz
parents:
diff changeset
430 int val = T::error; // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}
anatofuz
parents:
diff changeset
431 };
anatofuz
parents:
diff changeset
432 }
anatofuz
parents:
diff changeset
433 template void f5<int>(); // expected-note {{in instantiation of function template specialization 'PR21332::f5<int>' requested here}}
anatofuz
parents:
diff changeset
434
anatofuz
parents:
diff changeset
435 template<typename T> void f6() {
anatofuz
parents:
diff changeset
436 class S { // expected-note {{in instantiation of member function 'PR21332::f6()::S::get' requested here}}
anatofuz
parents:
diff changeset
437 void get() {
anatofuz
parents:
diff changeset
438 class S2 { // expected-note {{in instantiation of member class 'S2' requested here}}
anatofuz
parents:
diff changeset
439 void g1(int n = T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}
anatofuz
parents:
diff changeset
440 };
anatofuz
parents:
diff changeset
441 }
anatofuz
parents:
diff changeset
442 };
anatofuz
parents:
diff changeset
443 }
anatofuz
parents:
diff changeset
444 template void f6<int>(); // expected-note{{in instantiation of function template specialization 'PR21332::f6<int>' requested here}}
anatofuz
parents:
diff changeset
445
anatofuz
parents:
diff changeset
446 template<typename T> void f7() {
anatofuz
parents:
diff changeset
447 struct S { void g() noexcept(undefined_val); }; // expected-error{{use of undeclared identifier 'undefined_val'}}
anatofuz
parents:
diff changeset
448 }
anatofuz
parents:
diff changeset
449 template void f7<int>();
anatofuz
parents:
diff changeset
450 }
anatofuz
parents:
diff changeset
451
anatofuz
parents:
diff changeset
452 // rdar://23721638: Ensure that we correctly perform implicit
anatofuz
parents:
diff changeset
453 // conversions when instantiating the default arguments of local functions.
anatofuz
parents:
diff changeset
454 namespace rdar23721638 {
anatofuz
parents:
diff changeset
455 struct A {
anatofuz
parents:
diff changeset
456 A(const char *) = delete; // expected-note 2 {{explicitly marked deleted here}}
anatofuz
parents:
diff changeset
457 };
anatofuz
parents:
diff changeset
458
anatofuz
parents:
diff changeset
459 template <typename T> void foo() {
anatofuz
parents:
diff changeset
460 struct Inner { // expected-note {{in instantiation}}
anatofuz
parents:
diff changeset
461 void operator()(T a = "") {} // expected-error {{conversion function from 'const char [1]' to 'rdar23721638::A' invokes a deleted function}}
anatofuz
parents:
diff changeset
462 // expected-note@-1 {{passing argument to parameter 'a' here}}
anatofuz
parents:
diff changeset
463 // expected-note@-2 {{candidate function not viable}}
anatofuz
parents:
diff changeset
464 };
anatofuz
parents:
diff changeset
465 Inner()(); // expected-error {{no matching function}}
anatofuz
parents:
diff changeset
466 }
anatofuz
parents:
diff changeset
467 template void foo<A>(); // expected-note 2 {{in instantiation}}
anatofuz
parents:
diff changeset
468
anatofuz
parents:
diff changeset
469 template <typename T> void bar() {
anatofuz
parents:
diff changeset
470 auto lambda = [](T a = "") {}; // expected-error {{conversion function from 'const char [1]' to 'rdar23721638::A' invokes a deleted function}}
anatofuz
parents:
diff changeset
471 // expected-note@-1 {{passing argument to parameter 'a' here}}
anatofuz
parents:
diff changeset
472 // expected-note@-2 {{candidate function not viable}}
anatofuz
parents:
diff changeset
473 // expected-note@-3 {{conversion candidate of type}}
anatofuz
parents:
diff changeset
474 lambda(); // expected-error {{no matching function}}
anatofuz
parents:
diff changeset
475 }
anatofuz
parents:
diff changeset
476 template void bar<A>(); // expected-note {{in instantiation}}
anatofuz
parents:
diff changeset
477 }
anatofuz
parents:
diff changeset
478
anatofuz
parents:
diff changeset
479 namespace anon_union_default_member_init {
anatofuz
parents:
diff changeset
480 template<typename T> void f() {
anatofuz
parents:
diff changeset
481 struct S {
anatofuz
parents:
diff changeset
482 union {
anatofuz
parents:
diff changeset
483 int i = 0;
anatofuz
parents:
diff changeset
484 };
anatofuz
parents:
diff changeset
485 };
anatofuz
parents:
diff changeset
486 }
anatofuz
parents:
diff changeset
487 void g() { f<int>(); }
anatofuz
parents:
diff changeset
488 }