1 | // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -Wno-bind-to-temporary-copy |
2 | // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple |
3 | // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple |
4 | // RUN: %clang_cc1 -std=c++17 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple |
5 | |
6 | namespace dr1 { // dr1: no |
7 | namespace X { extern "C" void dr1_f(int a = 1); } |
8 | namespace Y { extern "C" void dr1_f(int a = 1); } |
9 | using X::dr1_f; using Y::dr1_f; |
10 | void g() { |
11 | dr1_f(0); |
12 | // FIXME: This should be rejected, due to the ambiguous default argument. |
13 | dr1_f(); |
14 | } |
15 | namespace X { |
16 | using Y::dr1_f; |
17 | void h() { |
18 | dr1_f(0); |
19 | // FIXME: This should be rejected, due to the ambiguous default argument. |
20 | dr1_f(); |
21 | } |
22 | } |
23 | |
24 | namespace X { |
25 | void z(int); |
26 | } |
27 | void X::z(int = 1) {} // expected-note {{previous}} |
28 | namespace X { |
29 | void z(int = 1); // expected-error {{redefinition of default argument}} |
30 | } |
31 | |
32 | void i(int = 1); |
33 | void j() { |
34 | void i(int = 1); |
35 | using dr1::i; |
36 | i(0); |
37 | // FIXME: This should be rejected, due to the ambiguous default argument. |
38 | i(); |
39 | } |
40 | void k() { |
41 | using dr1::i; |
42 | void i(int = 1); |
43 | i(0); |
44 | // FIXME: This should be rejected, due to the ambiguous default argument. |
45 | i(); |
46 | } |
47 | } |
48 | |
49 | namespace dr3 { // dr3: yes |
50 | template<typename T> struct A {}; |
51 | template<typename T> void f(T) { A<T> a; } // expected-note {{implicit instantiation}} |
52 | template void f(int); |
53 | template<> struct A<int> {}; // expected-error {{explicit specialization of 'dr3::A<int>' after instantiation}} |
54 | } |
55 | |
56 | namespace dr4 { // dr4: yes |
57 | extern "C" { |
58 | static void dr4_f(int) {} |
59 | static void dr4_f(float) {} |
60 | void dr4_g(int) {} // expected-note {{previous}} |
61 | void dr4_g(float) {} // expected-error {{conflicting types}} |
62 | } |
63 | } |
64 | |
65 | namespace dr5 { // dr5: yes |
66 | struct A {} a; |
67 | struct B { |
68 | B(const A&); |
69 | B(const B&); |
70 | }; |
71 | const volatile B b = a; |
72 | |
73 | struct C { C(C&); }; |
74 | struct D : C {}; |
75 | struct E { operator D&(); } e; |
76 | const C c = e; |
77 | } |
78 | |
79 | namespace dr7 { // dr7: yes |
80 | class A { public: ~A(); }; |
81 | class B : virtual private A {}; // expected-note 2 {{declared private here}} |
82 | class C : public B {} c; // expected-error 2 {{inherited virtual base class 'dr7::A' has private destructor}} \ |
83 | // expected-note {{implicit default constructor for 'dr7::C' first required here}} \ |
84 | // expected-note {{implicit destructor for 'dr7::C' first required here}} |
85 | class VeryDerivedC : public B, virtual public A {} vdc; |
86 | |
87 | class X { ~X(); }; // expected-note {{here}} |
88 | class Y : X { ~Y() {} }; // expected-error {{private destructor}} |
89 | |
90 | namespace PR16370 { // This regressed the first time DR7 was fixed. |
91 | struct S1 { virtual ~S1(); }; |
92 | struct S2 : S1 {}; |
93 | struct S3 : S2 {}; |
94 | struct S4 : virtual S2 {}; |
95 | struct S5 : S3, S4 { |
96 | S5(); |
97 | ~S5(); |
98 | }; |
99 | S5::S5() {} |
100 | } |
101 | } |
102 | |
103 | namespace dr8 { // dr8: dup 45 |
104 | class A { |
105 | struct U; |
106 | static const int k = 5; |
107 | void f(); |
108 | template<typename, int, void (A::*)()> struct T; |
109 | |
110 | T<U, k, &A::f> *g(); |
111 | }; |
112 | A::T<A::U, A::k, &A::f> *A::g() { return 0; } |
113 | } |
114 | |
115 | namespace dr9 { // dr9: yes |
116 | struct B { |
117 | protected: |
118 | int m; // expected-note {{here}} |
119 | friend int R1(); |
120 | }; |
121 | struct N : protected B { // expected-note 2{{protected}} |
122 | friend int R2(); |
123 | } n; |
124 | int R1() { return n.m; } // expected-error {{protected base class}} expected-error {{protected member}} |
125 | int R2() { return n.m; } |
126 | } |
127 | |
128 | namespace dr10 { // dr10: dup 45 |
129 | class A { |
130 | struct B { |
131 | A::B *p; |
132 | }; |
133 | }; |
134 | } |
135 | |
136 | namespace dr11 { // dr11: yes |
137 | template<typename T> struct A : T { |
138 | using typename T::U; |
139 | U u; |
140 | }; |
141 | template<typename T> struct B : T { |
142 | using T::V; |
143 | V v; // expected-error {{unknown type name}} |
144 | }; |
145 | struct X { typedef int U; }; |
146 | A<X> ax; |
147 | } |
148 | |
149 | namespace dr12 { // dr12: sup 239 |
150 | enum E { e }; |
151 | E &f(E, E = e); |
152 | void g() { |
153 | int &f(int, E = e); |
154 | // Under DR12, these call two different functions. |
155 | // Under DR239, they call the same function. |
156 | int &b = f(e); |
157 | int &c = f(1); |
158 | } |
159 | } |
160 | |
161 | namespace dr13 { // dr13: no |
162 | extern "C" void f(int); |
163 | void g(char); |
164 | |
165 | template<typename T> struct A { |
166 | A(void (*fp)(T)); |
167 | }; |
168 | template<typename T> int h(void (T)); |
169 | |
170 | A<int> a1(f); // FIXME: We should reject this. |
171 | A<char> a2(g); |
172 | int a3 = h(f); // FIXME: We should reject this. |
173 | int a4 = h(g); |
174 | } |
175 | |
176 | namespace dr14 { // dr14: yes |
177 | namespace X { extern "C" int dr14_f(); } |
178 | namespace Y { extern "C" int dr14_f(); } |
179 | using namespace X; |
180 | using namespace Y; |
181 | int k = dr14_f(); |
182 | |
183 | class C { |
184 | int k; |
185 | friend int Y::dr14_f(); |
186 | } c; |
187 | namespace Z { |
188 | extern "C" int dr14_f() { return c.k; } |
189 | } |
190 | |
191 | namespace X { typedef int T; typedef int U; } // expected-note {{candidate}} |
192 | namespace Y { typedef int T; typedef long U; } // expected-note {{candidate}} |
193 | T t; // ok, same type both times |
194 | U u; // expected-error {{ambiguous}} |
195 | } |
196 | |
197 | namespace dr15 { // dr15: yes |
198 | template<typename T> void f(int); // expected-note {{previous}} |
199 | template<typename T> void f(int = 0); // expected-error {{default arguments cannot be added}} |
200 | } |
201 | |
202 | namespace dr16 { // dr16: yes |
203 | class A { // expected-note {{here}} |
204 | void f(); // expected-note {{here}} |
205 | friend class C; |
206 | }; |
207 | class B : A {}; // expected-note 4{{here}} |
208 | class C : B { |
209 | void g() { |
210 | f(); // expected-error {{private member}} expected-error {{private base}} |
211 | A::f(); // expected-error {{private member}} expected-error {{private base}} |
212 | } |
213 | }; |
214 | } |
215 | |
216 | namespace dr17 { // dr17: yes |
217 | class A { |
218 | int n; |
219 | int f(); |
220 | struct C; |
221 | }; |
222 | struct B : A {} b; |
223 | int A::f() { return b.n; } |
224 | struct A::C : A { |
225 | int g() { return n; } |
226 | }; |
227 | } |
228 | |
229 | // dr18: sup 577 |
230 | |
231 | namespace dr19 { // dr19: yes |
232 | struct A { |
233 | int n; // expected-note {{here}} |
234 | }; |
235 | struct B : protected A { // expected-note {{here}} |
236 | }; |
237 | struct C : B {} c; |
238 | struct D : B { |
239 | int get1() { return c.n; } // expected-error {{protected member}} |
240 | int get2() { return ((A&)c).n; } // ok, A is an accessible base of B from here |
241 | }; |
242 | } |
243 | |
244 | namespace dr20 { // dr20: yes |
245 | class X { |
246 | public: |
247 | X(); |
248 | private: |
249 | X(const X&); // expected-note {{here}} |
250 | }; |
251 | X &f(); |
252 | X x = f(); // expected-error {{private}} |
253 | } |
254 | |
255 | namespace dr21 { // dr21: yes |
256 | template<typename T> struct A; |
257 | struct X { |
258 | template<typename T = int> friend struct A; // expected-error {{default template argument not permitted on a friend template}} |
259 | template<typename T = int> friend struct B; // expected-error {{default template argument not permitted on a friend template}} |
260 | }; |
261 | } |
262 | |
263 | namespace dr22 { // dr22: sup 481 |
264 | template<typename dr22_T = dr22_T> struct X; // expected-error {{unknown type name 'dr22_T'}} |
265 | typedef int T; |
266 | template<typename T = T> struct Y; |
267 | } |
268 | |
269 | namespace dr23 { // dr23: yes |
270 | template<typename T> void f(T, T); // expected-note {{candidate}} |
271 | template<typename T> void f(T, int); // expected-note {{candidate}} |
272 | void g() { f(0, 0); } // expected-error {{ambiguous}} |
273 | } |
274 | |
275 | // dr24: na |
276 | |
277 | namespace dr25 { // dr25: yes |
278 | struct A { |
279 | void f() throw(int); // expected-error 0-1{{ISO C++17 does not allow}} expected-note 0-1{{use 'noexcept}} |
280 | }; |
281 | void (A::*f)() throw (int); // expected-error 0-1{{ISO C++17 does not allow}} expected-note 0-1{{use 'noexcept}} |
282 | void (A::*g)() throw () = f; |
283 | #if __cplusplus <= 201402L |
284 | // expected-error@-2 {{is not superset of source}} |
285 | #else |
286 | // expected-error@-4 {{different exception specifications}} |
287 | #endif |
288 | void (A::*g2)() throw () = 0; |
289 | void (A::*h)() throw (int, char) = f; // expected-error 0-1{{ISO C++17 does not allow}} expected-note 0-1{{use 'noexcept}} |
290 | void (A::*i)() throw () = &A::f; |
291 | #if __cplusplus <= 201402L |
292 | // expected-error@-2 {{is not superset of source}} |
293 | #else |
294 | // expected-error@-4 {{different exception specifications}} |
295 | #endif |
296 | void (A::*i2)() throw () = 0; |
297 | void (A::*j)() throw (int, char) = &A::f; // expected-error 0-1{{ISO C++17 does not allow}} expected-note 0-1{{use 'noexcept}} |
298 | void x() { |
299 | g2 = f; |
300 | #if __cplusplus <= 201402L |
301 | // expected-error@-2 {{is not superset of source}} |
302 | #else |
303 | // expected-error@-4 {{different exception specifications}} |
304 | #endif |
305 | h = f; |
306 | i2 = &A::f; |
307 | #if __cplusplus <= 201402L |
308 | // expected-error@-2 {{is not superset of source}} |
309 | #else |
310 | // expected-error@-4 {{different exception specifications}} |
311 | #endif |
312 | j = &A::f; |
313 | } |
314 | } |
315 | |
316 | namespace dr26 { // dr26: yes |
317 | struct A { A(A, const A & = A()); }; // expected-error {{must pass its first argument by reference}} |
318 | struct B { |
319 | B(); // expected-note 0-1{{candidate}} |
320 | B(const B &, B = B()); |
321 | #if __cplusplus <= 201402L |
322 | // expected-error@-2 {{no matching constructor}} expected-note@-2 {{candidate}} expected-note@-2 {{here}} |
323 | #endif |
324 | }; |
325 | struct C { |
326 | static C &f(); |
327 | C(const C &, C = f()); // expected-error {{no matching constructor}} expected-note {{candidate}} expected-note {{here}} |
328 | }; |
329 | } |
330 | |
331 | namespace dr27 { // dr27: yes |
332 | enum E { e } n; |
333 | E &m = true ? n : n; |
334 | } |
335 | |
336 | // dr28: na lib |
337 | |
338 | namespace dr29 { // dr29: 3.4 |
339 | void dr29_f0(); // expected-note {{here}} |
340 | void g0() { void dr29_f0(); } |
341 | extern "C++" void g0_cxx() { void dr29_f0(); } |
342 | extern "C" void g0_c() { void dr29_f0(); } // expected-error {{different language linkage}} |
343 | |
344 | extern "C" void dr29_f1(); // expected-note {{here}} |
345 | void g1() { void dr29_f1(); } |
346 | extern "C" void g1_c() { void dr29_f1(); } |
347 | extern "C++" void g1_cxx() { void dr29_f1(); } // expected-error {{different language linkage}} |
348 | |
349 | void g2() { void dr29_f2(); } // expected-note {{here}} |
350 | extern "C" void dr29_f2(); // expected-error {{different language linkage}} |
351 | |
352 | extern "C" void g3() { void dr29_f3(); } // expected-note {{here}} |
353 | extern "C++" void dr29_f3(); // expected-error {{different language linkage}} |
354 | |
355 | extern "C++" void g4() { void dr29_f4(); } // expected-note {{here}} |
356 | extern "C" void dr29_f4(); // expected-error {{different language linkage}} |
357 | |
358 | extern "C" void g5(); |
359 | extern "C++" void dr29_f5(); |
360 | void g5() { |
361 | void dr29_f5(); // ok, g5 is extern "C" but we're not inside the linkage-specification here. |
362 | } |
363 | |
364 | extern "C++" void g6(); |
365 | extern "C" void dr29_f6(); |
366 | void g6() { |
367 | void dr29_f6(); // ok, g6 is extern "C" but we're not inside the linkage-specification here. |
368 | } |
369 | |
370 | extern "C" void g7(); |
371 | extern "C++" void dr29_f7(); // expected-note {{here}} |
372 | extern "C" void g7() { |
373 | void dr29_f7(); // expected-error {{different language linkage}} |
374 | } |
375 | |
376 | extern "C++" void g8(); |
377 | extern "C" void dr29_f8(); // expected-note {{here}} |
378 | extern "C++" void g8() { |
379 | void dr29_f8(); // expected-error {{different language linkage}} |
380 | } |
381 | } |
382 | |
383 | namespace dr30 { // dr30: sup 468 c++11 |
384 | struct A { |
385 | template<int> static int f(); |
386 | } a, *p = &a; |
387 | int x = A::template f<0>(); |
388 | int y = a.template f<0>(); |
389 | int z = p->template f<0>(); |
390 | #if __cplusplus < 201103L |
391 | // FIXME: It's not clear whether DR468 applies to C++98 too. |
392 | // expected-error@-5 {{'template' keyword outside of a template}} |
393 | // expected-error@-5 {{'template' keyword outside of a template}} |
394 | // expected-error@-5 {{'template' keyword outside of a template}} |
395 | #endif |
396 | } |
397 | |
398 | namespace dr31 { // dr31: yes |
399 | class X { |
400 | private: |
401 | void operator delete(void*); // expected-note {{here}} |
402 | }; |
403 | // We would call X::operator delete if X() threw (even though it can't, |
404 | // and even though we allocated the X using ::operator delete). |
405 | X *p = new X; // expected-error {{private}} |
406 | } |
407 | |
408 | // dr32: na |
409 | |
410 | namespace dr33 { // dr33: yes |
411 | namespace X { struct S; void f(void (*)(S)); } // expected-note {{candidate}} |
412 | namespace Y { struct T; void f(void (*)(T)); } // expected-note {{candidate}} |
413 | void g(X::S); |
414 | template<typename Z> Z g(Y::T); |
415 | void h() { f(&g); } // expected-error {{ambiguous}} |
416 | |
417 | template<typename T> void t(X::S); |
418 | template<typename T, typename U = void> void u(X::S); // expected-error 0-1{{default template argument}} |
419 | void templ() { f(t<int>); f(u<int>); } |
420 | |
421 | // Even though v<int> cannot select the first overload, ADL considers it |
422 | // and adds namespace Z to the set of associated namespaces, and then picks |
423 | // Z::f even though that function has nothing to do with any associated type. |
424 | namespace Z { struct Q; void f(void(*)()); } |
425 | template<int> Z::Q v(); |
426 | template<typename> void v(); |
427 | void unrelated_templ() { f(v<int>); } |
428 | |
429 | namespace dependent { |
430 | struct X {}; |
431 | template<class T> struct Y { |
432 | friend int operator+(X, void(*)(Y)) {} |
433 | }; |
434 | |
435 | template<typename T> void f(Y<T>); |
436 | int use = X() + f<int>; // expected-error {{invalid operands}} |
437 | } |
438 | |
439 | namespace member { |
440 | struct Q {}; |
441 | struct Y { friend int operator+(Q, Y (*)()); }; |
442 | struct X { template<typename> static Y f(); }; |
443 | int m = Q() + X().f<int>; // ok |
444 | int n = Q() + (&(X().f<int>)); // ok |
445 | } |
446 | } |
447 | |
448 | // dr34: na |
449 | // dr35: dup 178 |
450 | // dr37: sup 475 |
451 | |
452 | namespace dr38 { // dr38: yes |
453 | template<typename T> struct X {}; |
454 | template<typename T> X<T> operator+(X<T> a, X<T> b) { return a; } |
455 | template X<int> operator+<int>(X<int>, X<int>); |
456 | } |
457 | |
458 | namespace dr39 { // dr39: no |
459 | namespace example1 { |
460 | struct A { int &f(int); }; |
461 | struct B : A { |
462 | using A::f; |
463 | float &f(float); |
464 | } b; |
465 | int &r = b.f(0); |
466 | } |
467 | |
468 | namespace example2 { |
469 | struct A { |
470 | int &x(int); // expected-note {{found}} |
471 | static int &y(int); // expected-note {{found}} |
472 | }; |
473 | struct V { |
474 | int &z(int); |
475 | }; |
476 | struct B : A, virtual V { |
477 | using A::x; // expected-note {{found}} |
478 | float &x(float); |
479 | using A::y; // expected-note {{found}} |
480 | static float &y(float); |
481 | using V::z; |
482 | float &z(float); |
483 | }; |
484 | struct C : A, B, virtual V {} c; // expected-warning {{direct base 'dr39::example2::A' is inaccessible due to ambiguity:\n struct dr39::example2::C -> struct dr39::example2::A\n struct dr39::example2::C -> struct dr39::example2::B -> struct dr39::example2::A}} |
485 | int &x = c.x(0); // expected-error {{found in multiple base classes}} |
486 | // FIXME: This is valid, because we find the same static data member either way. |
487 | int &y = c.y(0); // expected-error {{found in multiple base classes}} |
488 | int &z = c.z(0); |
489 | } |
490 | |
491 | namespace example3 { |
492 | struct A { static int f(); }; |
493 | struct B : virtual A { using A::f; }; |
494 | struct C : virtual A { using A::f; }; |
495 | struct D : B, C {} d; |
496 | int k = d.f(); |
497 | } |
498 | |
499 | namespace example4 { |
500 | struct A { int n; }; // expected-note {{found}} |
501 | struct B : A {}; |
502 | struct C : A {}; |
503 | struct D : B, C { int f() { return n; } }; // expected-error {{found in multiple base-class}} |
504 | } |
505 | |
506 | namespace PR5916 { |
507 | // FIXME: This is valid. |
508 | struct A { int n; }; // expected-note +{{found}} |
509 | struct B : A {}; |
510 | struct C : A {}; |
511 | struct D : B, C {}; |
512 | int k = sizeof(D::n); // expected-error {{found in multiple base}} expected-error {{unknown type name}} |
513 | #if __cplusplus >= 201103L |
514 | decltype(D::n) n; // expected-error {{found in multiple base}} |
515 | #endif |
516 | } |
517 | } |
518 | |
519 | // dr40: na |
520 | |
521 | namespace dr41 { // dr41: yes |
522 | struct S f(S); |
523 | } |
524 | |
525 | namespace dr42 { // dr42: yes |
526 | struct A { static const int k = 0; }; |
527 | struct B : A { static const int k = A::k; }; |
528 | } |
529 | |
530 | // dr43: na |
531 | |
532 | namespace dr44 { // dr44: sup 727 |
533 | struct A { |
534 | template<int> void f(); |
535 | template<> void f<0>(); |
536 | }; |
537 | } |
538 | |
539 | namespace dr45 { // dr45: yes |
540 | class A { |
541 | class B {}; |
542 | class C : B {}; |
543 | C c; |
544 | }; |
545 | } |
546 | |
547 | namespace dr46 { // dr46: yes |
548 | template<typename> struct A { template<typename> struct B {}; }; |
549 | template template struct A<int>::B<int>; // expected-error {{expected unqualified-id}} |
550 | } |
551 | |
552 | namespace dr47 { // dr47: sup 329 |
553 | template<typename T> struct A { |
554 | friend void f() { T t; } // expected-error {{redefinition}} expected-note {{previous}} |
555 | }; |
556 | A<int> a; |
557 | A<float> b; // expected-note {{instantiation of}} |
558 | |
559 | void f(); |
560 | void g() { f(); } |
561 | } |
562 | |
563 | namespace dr48 { // dr48: yes |
564 | namespace { |
565 | struct S { |
566 | static const int m = 0; |
567 | static const int n = 0; |
568 | static const int o = 0; |
569 | }; |
570 | } |
571 | int a = S::m; |
572 | // FIXME: We should produce a 'has internal linkage but is not defined' |
573 | // diagnostic for 'S::n'. |
574 | const int &b = S::n; |
575 | const int S::o; |
576 | const int &c = S::o; |
577 | } |
578 | |
579 | namespace dr49 { // dr49: yes |
580 | template<int*> struct A {}; // expected-note 0-2{{here}} |
581 | int k; |
582 | #if __has_feature(cxx_constexpr) |
583 | constexpr |
584 | #endif |
585 | int *const p = &k; // expected-note 0-2{{here}} |
586 | A<&k> a; |
587 | A<p> b; |
588 | #if __cplusplus <= 201402L |
589 | // expected-error@-2 {{must have its address taken}} |
590 | #endif |
591 | #if __cplusplus < 201103L |
592 | // expected-error@-5 {{internal linkage}} |
593 | #endif |
594 | int *q = &k; |
595 | A<q> c; |
596 | #if __cplusplus < 201103L |
597 | // expected-error@-2 {{must have its address taken}} |
598 | #else |
599 | // expected-error@-4 {{constant expression}} |
600 | // expected-note@-5 {{read of non-constexpr}} |
601 | // expected-note@-7 {{declared here}} |
602 | #endif |
603 | } |
604 | |
605 | namespace dr50 { // dr50: yes |
606 | struct X; // expected-note {{forward}} |
607 | extern X *p; |
608 | X *q = (X*)p; |
609 | X *r = static_cast<X*>(p); |
610 | X *s = const_cast<X*>(p); |
611 | X *t = reinterpret_cast<X*>(p); |
612 | X *u = dynamic_cast<X*>(p); // expected-error {{incomplete}} |
613 | } |
614 | |
615 | namespace dr51 { // dr51: yes |
616 | struct A {}; |
617 | struct B : A {}; |
618 | struct S { |
619 | operator A&(); |
620 | operator B&(); |
621 | } s; |
622 | A &a = s; |
623 | } |
624 | |
625 | namespace dr52 { // dr52: yes |
626 | struct A { int n; }; // expected-note {{here}} |
627 | struct B : private A {} b; // expected-note 2{{private}} |
628 | // FIXME: This first diagnostic is very strangely worded, and seems to be bogus. |
629 | int k = b.A::n; // expected-error {{'A' is a private member of 'dr52::A'}} |
630 | // expected-error@-1 {{cannot cast 'struct B' to its private base}} |
631 | } |
632 | |
633 | namespace dr53 { // dr53: yes |
634 | int n = 0; |
635 | enum E { e } x = static_cast<E>(n); |
636 | } |
637 | |
638 | namespace dr54 { // dr54: yes |
639 | struct A { int a; } a; |
640 | struct V { int v; } v; |
641 | struct B : private A, virtual V { int b; } b; // expected-note 6{{private here}} |
642 | |
643 | A &sab = static_cast<A&>(b); // expected-error {{private base}} |
644 | A *spab = static_cast<A*>(&b); // expected-error {{private base}} |
645 | int A::*smab = static_cast<int A::*>(&B::b); // expected-error {{private base}} |
646 | B &sba = static_cast<B&>(a); // expected-error {{private base}} |
647 | B *spba = static_cast<B*>(&a); // expected-error {{private base}} |
648 | int B::*smba = static_cast<int B::*>(&A::a); // expected-error {{private base}} |
649 | |
650 | V &svb = static_cast<V&>(b); |
651 | V *spvb = static_cast<V*>(&b); |
652 | int V::*smvb = static_cast<int V::*>(&B::b); // expected-error {{virtual base}} |
653 | B &sbv = static_cast<B&>(v); // expected-error {{virtual base}} |
654 | B *spbv = static_cast<B*>(&v); // expected-error {{virtual base}} |
655 | int B::*smbv = static_cast<int B::*>(&V::v); // expected-error {{virtual base}} |
656 | |
657 | A &cab = (A&)(b); |
658 | A *cpab = (A*)(&b); |
659 | int A::*cmab = (int A::*)(&B::b); |
660 | B &cba = (B&)(a); |
661 | B *cpba = (B*)(&a); |
662 | int B::*cmba = (int B::*)(&A::a); |
663 | |
664 | V &cvb = (V&)(b); |
665 | V *cpvb = (V*)(&b); |
666 | int V::*cmvb = (int V::*)(&B::b); // expected-error {{virtual base}} |
667 | B &cbv = (B&)(v); // expected-error {{virtual base}} |
668 | B *cpbv = (B*)(&v); // expected-error {{virtual base}} |
669 | int B::*cmbv = (int B::*)(&V::v); // expected-error {{virtual base}} |
670 | } |
671 | |
672 | namespace dr55 { // dr55: yes |
673 | enum E { e = 5 }; |
674 | int test[(e + 1 == 6) ? 1 : -1]; |
675 | } |
676 | |
677 | namespace dr56 { // dr56: yes |
678 | struct A { |
679 | typedef int T; // expected-note {{previous}} |
680 | typedef int T; // expected-error {{redefinition}} |
681 | }; |
682 | struct B { |
683 | struct X; |
684 | typedef X X; // expected-note {{previous}} |
685 | typedef X X; // expected-error {{redefinition}} |
686 | }; |
687 | } |
688 | |
689 | namespace dr58 { // dr58: yes |
690 | // FIXME: Ideally, we should have a CodeGen test for this. |
691 | #if __cplusplus >= 201103L |
692 | enum E1 { E1_0 = 0, E1_1 = 1 }; |
693 | enum E2 { E2_0 = 0, E2_m1 = -1 }; |
694 | struct X { E1 e1 : 1; E2 e2 : 1; }; |
695 | static_assert(X{E1_1, E2_m1}.e1 == 1, ""); |
696 | static_assert(X{E1_1, E2_m1}.e2 == -1, ""); |
697 | #endif |
698 | } |
699 | |
700 | namespace dr59 { // dr59: yes |
701 | template<typename T> struct convert_to { operator T() const; }; |
702 | struct A {}; // expected-note 5+{{candidate}} |
703 | struct B : A {}; // expected-note 0+{{candidate}} |
704 | |
705 | A a1 = convert_to<A>(); |
706 | A a2 = convert_to<A&>(); |
707 | A a3 = convert_to<const A>(); |
708 | A a4 = convert_to<const volatile A>(); |
709 | #if __cplusplus <= 201402L |
710 | // expected-error@-2 {{no viable}} |
711 | #endif |
712 | A a5 = convert_to<const volatile A&>(); // expected-error {{no viable}} |
713 | |
714 | B b1 = convert_to<B>(); |
715 | B b2 = convert_to<B&>(); |
716 | B b3 = convert_to<const B>(); |
717 | B b4 = convert_to<const volatile B>(); |
718 | #if __cplusplus <= 201402L |
719 | // expected-error@-2 {{no viable}} |
720 | #endif |
721 | B b5 = convert_to<const volatile B&>(); // expected-error {{no viable}} |
722 | |
723 | A c1 = convert_to<B>(); |
724 | A c2 = convert_to<B&>(); |
725 | A c3 = convert_to<const B>(); |
726 | A c4 = convert_to<const volatile B>(); // expected-error {{no viable}} |
727 | A c5 = convert_to<const volatile B&>(); // expected-error {{no viable}} |
728 | |
729 | int n1 = convert_to<int>(); |
730 | int n2 = convert_to<int&>(); |
731 | int n3 = convert_to<const int>(); |
732 | int n4 = convert_to<const volatile int>(); |
733 | int n5 = convert_to<const volatile int&>(); |
734 | } |
735 | |
736 | namespace dr60 { // dr60: yes |
737 | void f(int &); |
738 | int &f(...); |
739 | const int k = 0; |
740 | int &n = f(k); |
741 | } |
742 | |
743 | namespace dr61 { // dr61: yes |
744 | struct X { |
745 | static void f(); |
746 | } x; |
747 | struct Y { |
748 | static void f(); |
749 | static void f(int); |
750 | } y; |
751 | // This is (presumably) valid, because x.f does not refer to an overloaded |
752 | // function name. |
753 | void (*p)() = &x.f; |
754 | void (*q)() = &y.f; // expected-error {{cannot create a non-constant pointer to member function}} |
755 | void (*r)() = y.f; // expected-error {{cannot create a non-constant pointer to member function}} |
756 | } |
757 | |
758 | namespace dr62 { // dr62: yes |
759 | struct A { |
760 | struct { int n; } b; |
761 | }; |
762 | template<typename T> struct X {}; |
763 | template<typename T> T get() { return get<T>(); } |
764 | template<typename T> int take(T) { return 0; } |
765 | |
766 | X<A> x1; |
767 | A a = get<A>(); |
768 | |
769 | typedef struct { } *NoNameForLinkagePtr; |
770 | #if __cplusplus < 201103L |
771 | // expected-note@-2 5{{here}} |
772 | #endif |
773 | NoNameForLinkagePtr noNameForLinkagePtr; |
774 | |
775 | struct Danger { |
776 | NoNameForLinkagePtr p; |
777 | }; |
778 | |
779 | X<NoNameForLinkagePtr> x2; |
780 | X<const NoNameForLinkagePtr> x3; |
781 | NoNameForLinkagePtr p1 = get<NoNameForLinkagePtr>(); |
782 | NoNameForLinkagePtr p2 = get<const NoNameForLinkagePtr>(); |
783 | int n1 = take(noNameForLinkagePtr); |
784 | #if __cplusplus < 201103L |
785 | // expected-error@-6 {{uses unnamed type}} |
786 | // expected-error@-6 {{uses unnamed type}} |
787 | // expected-error@-6 {{uses unnamed type}} |
788 | // expected-error@-6 {{uses unnamed type}} |
789 | // expected-error@-6 {{uses unnamed type}} |
790 | #endif |
791 | |
792 | X<Danger> x4; |
793 | |
794 | void f() { |
795 | struct NoLinkage {}; |
796 | X<NoLinkage> a; |
797 | X<const NoLinkage> b; |
798 | get<NoLinkage>(); |
799 | get<const NoLinkage>(); |
800 | X<void (*)(NoLinkage A::*)> c; |
801 | X<int NoLinkage::*> d; |
802 | #if __cplusplus < 201103L |
803 | // expected-error@-7 {{uses local type}} |
804 | // expected-error@-7 {{uses local type}} |
805 | // expected-error@-7 {{uses local type}} |
806 | // expected-error@-7 {{uses local type}} |
807 | // expected-error@-7 {{uses local type}} |
808 | // expected-error@-7 {{uses local type}} |
809 | #endif |
810 | } |
811 | } |
812 | |
813 | namespace dr63 { // dr63: yes |
814 | template<typename T> struct S { typename T::error e; }; |
815 | extern S<int> *p; |
816 | void *q = p; |
817 | } |
818 | |
819 | namespace dr64 { // dr64: yes |
820 | template<class T> void f(T); |
821 | template<class T> void f(T*); |
822 | template<> void f(int*); |
823 | template<> void f<int>(int*); |
824 | template<> void f(int); |
825 | } |
826 | |
827 | // dr65: na |
828 | |
829 | namespace dr66 { // dr66: no |
830 | namespace X { |
831 | int f(int n); // expected-note 2{{candidate}} |
832 | } |
833 | using X::f; |
834 | namespace X { |
835 | int f(int n = 0); |
836 | int f(int, int); |
837 | } |
838 | // FIXME: The first two calls here should be accepted. |
839 | int a = f(); // expected-error {{no matching function}} |
840 | int b = f(1); |
841 | int c = f(1, 2); // expected-error {{no matching function}} |
842 | } |
843 | |
844 | // dr67: na |
845 | |
846 | namespace dr68 { // dr68: yes |
847 | template<typename T> struct X {}; |
848 | struct ::dr68::X<int> x1; |
849 | struct ::dr68::template X<int> x2; |
850 | #if __cplusplus < 201103L |
851 | // expected-error@-2 {{'template' keyword outside of a template}} |
852 | #endif |
853 | struct Y { |
854 | friend struct X<int>; |
855 | friend struct ::dr68::X<char>; |
856 | friend struct ::dr68::template X<double>; |
857 | #if __cplusplus < 201103L |
858 | // expected-error@-2 {{'template' keyword outside of a template}} |
859 | #endif |
860 | }; |
861 | template<typename> |
862 | struct Z { |
863 | friend struct ::dr68::template X<double>; |
864 | friend typename ::dr68::X<double>; |
865 | #if __cplusplus < 201103L |
866 | // expected-error@-2 {{C++11 extension}} |
867 | #endif |
868 | }; |
869 | } |
870 | |
871 | namespace dr69 { // dr69: yes |
872 | template<typename T> static void f() {} |
873 | // FIXME: Should we warn here? |
874 | inline void g() { f<int>(); } |
875 | // FIXME: This should be rejected, per [temp.explicit]p11. |
876 | extern template void f<char>(); |
877 | #if __cplusplus < 201103L |
878 | // expected-error@-2 {{C++11 extension}} |
879 | #endif |
880 | template<void(*)()> struct Q {}; |
881 | Q<&f<int> > q; |
882 | #if __cplusplus < 201103L |
883 | // expected-error@-2 {{internal linkage}} expected-note@-11 {{here}} |
884 | #endif |
885 | } |
886 | |
887 | namespace dr70 { // dr70: yes |
888 | template<int> struct A {}; |
889 | template<int I, int J> int f(int (&)[I + J], A<I>, A<J>); |
890 | int arr[7]; |
891 | int k = f(arr, A<3>(), A<4>()); |
892 | } |
893 | |
894 | // dr71: na |
895 | // dr72: dup 69 |
896 | |
897 | #if __cplusplus >= 201103L |
898 | namespace dr73 { // dr73: no |
899 | // The resolution to dr73 is unworkable. Consider: |
900 | int a, b; |
901 | static_assert(&a + 1 != &b, ""); // expected-error {{not an integral constant expression}} |
902 | } |
903 | #endif |
904 | |
905 | namespace dr74 { // dr74: yes |
906 | enum E { k = 5 }; |
907 | int (*p)[k] = new int[k][k]; |
908 | } |
909 | |
910 | namespace dr75 { // dr75: yes |
911 | struct S { |
912 | static int n = 0; // expected-error {{non-const}} |
913 | }; |
914 | } |
915 | |
916 | namespace dr76 { // dr76: yes |
917 | const volatile int n = 1; |
918 | int arr[n]; // expected-error +{{variable length array}} |
919 | } |
920 | |
921 | namespace dr77 { // dr77: yes |
922 | struct A { |
923 | struct B {}; |
924 | friend struct B; |
925 | }; |
926 | } |
927 | |
928 | namespace dr78 { // dr78: sup ???? |
929 | // Under DR78, this is valid, because 'k' has static storage duration, so is |
930 | // zero-initialized. |
931 | const int k; // expected-error {{default initialization of an object of const}} |
932 | } |
933 | |
934 | // dr79: na |
935 | |
936 | namespace dr80 { // dr80: yes |
937 | struct A { |
938 | int A; |
939 | }; |
940 | struct B { |
941 | static int B; // expected-error {{same name as its class}} |
942 | }; |
943 | struct C { |
944 | int C; // expected-error {{same name as its class}} |
945 | C(); |
946 | }; |
947 | struct D { |
948 | D(); |
949 | int D; // expected-error {{same name as its class}} |
950 | }; |
951 | } |
952 | |
953 | // dr81: na |
954 | // dr82: dup 48 |
955 | |
956 | namespace dr83 { // dr83: yes |
957 | int &f(const char*); |
958 | char &f(char *); |
959 | int &k = f("foo"); |
960 | } |
961 | |
962 | namespace dr84 { // dr84: yes |
963 | struct B; |
964 | struct A { operator B() const; }; |
965 | struct C {}; |
966 | struct B { |
967 | B(B&); // expected-note 0-1{{candidate}} |
968 | B(C); // expected-note 0-1{{no known conversion from 'dr84::B' to 'dr84::C'}} |
969 | operator C() const; |
970 | }; |
971 | A a; |
972 | // Cannot use B(C) / operator C() pair to construct the B from the B temporary |
973 | // here. In C++17, we initialize the B object directly using 'A::operator B()'. |
974 | B b = a; |
975 | #if __cplusplus <= 201402L |
976 | // expected-error@-2 {{no viable}} |
977 | #endif |
978 | } |
979 | |
980 | namespace dr85 { // dr85: yes |
981 | struct A { |
982 | struct B; |
983 | struct B {}; // expected-note{{previous declaration is here}} |
984 | struct B; // expected-error{{class member cannot be redeclared}} |
985 | |
986 | union U; |
987 | union U {}; // expected-note{{previous declaration is here}} |
988 | union U; // expected-error{{class member cannot be redeclared}} |
989 | |
990 | #if __cplusplus >= 201103L |
991 | enum E1 : int; |
992 | enum E1 : int { e1 }; // expected-note{{previous declaration is here}} |
993 | enum E1 : int; // expected-error{{class member cannot be redeclared}} |
994 | |
995 | enum class E2; |
996 | enum class E2 { e2 }; // expected-note{{previous declaration is here}} |
997 | enum class E2; // expected-error{{class member cannot be redeclared}} |
998 | #endif |
999 | }; |
1000 | |
1001 | template <typename T> |
1002 | struct C { |
1003 | struct B {}; // expected-note{{previous declaration is here}} |
1004 | struct B; // expected-error{{class member cannot be redeclared}} |
1005 | }; |
1006 | } |
1007 | |
1008 | // dr86: dup 446 |
1009 | |
1010 | namespace dr87 { // dr87: no |
1011 | // FIXME: Superseded by dr1975 |
1012 | template<typename T> struct X {}; |
1013 | // FIXME: This is invalid. |
1014 | X<void() throw()> x; |
1015 | // This is valid under dr87 but not under dr1975. |
1016 | X<void(void() throw())> y; |
1017 | } |
1018 | |
1019 | namespace dr88 { // dr88: yes |
1020 | template<typename T> struct S { |
1021 | static const int a = 1; // expected-note {{previous}} |
1022 | static const int b; |
1023 | }; |
1024 | template<> const int S<int>::a = 4; // expected-error {{already has an initializer}} |
1025 | template<> const int S<int>::b = 4; |
1026 | } |
1027 | |
1028 | // dr89: na |
1029 | |
1030 | namespace dr90 { // dr90: yes |
1031 | struct A { |
1032 | template<typename T> friend void dr90_f(T); |
1033 | }; |
1034 | struct B : A { |
1035 | template<typename T> friend void dr90_g(T); |
1036 | struct C {}; |
1037 | union D {}; |
1038 | }; |
1039 | struct E : B {}; |
1040 | struct F : B::C {}; |
1041 | |
1042 | void test() { |
1043 | dr90_f(A()); |
1044 | dr90_f(B()); |
1045 | dr90_f(B::C()); // expected-error {{undeclared identifier}} |
1046 | dr90_f(B::D()); // expected-error {{undeclared identifier}} |
1047 | dr90_f(E()); |
1048 | dr90_f(F()); // expected-error {{undeclared identifier}} |
1049 | |
1050 | dr90_g(A()); // expected-error {{undeclared identifier}} |
1051 | dr90_g(B()); |
1052 | dr90_g(B::C()); |
1053 | dr90_g(B::D()); |
1054 | dr90_g(E()); |
1055 | dr90_g(F()); // expected-error {{undeclared identifier}} |
1056 | } |
1057 | } |
1058 | |
1059 | namespace dr91 { // dr91: yes |
1060 | union U { friend int f(U); }; |
1061 | int k = f(U()); |
1062 | } |
1063 | |
1064 | namespace dr92 { // dr92: 4 c++17 |
1065 | void f() throw(int, float); // expected-error 0-1{{ISO C++17 does not allow}} expected-note 0-1{{use 'noexcept}} |
1066 | void (*p)() throw(int) = &f; // expected-error 0-1{{ISO C++17 does not allow}} expected-note 0-1{{use 'noexcept}} |
1067 | #if __cplusplus <= 201402L |
1068 | // expected-error@-2 {{target exception specification is not superset of source}} |
1069 | #else |
1070 | // expected-warning@-4 {{target exception specification is not superset of source}} |
1071 | #endif |
1072 | void (*q)() throw(int); // expected-error 0-1{{ISO C++17 does not allow}} expected-note 0-1{{use 'noexcept}} |
1073 | void (**pp)() throw() = &q; |
1074 | #if __cplusplus <= 201402L |
1075 | // expected-error@-2 {{exception specifications are not allowed}} |
1076 | #else |
1077 | // expected-error@-4 {{cannot initialize}} |
1078 | #endif |
1079 | |
1080 | void g(void() throw()); // expected-note 0-2 {{no known conversion}} expected-warning 0-1{{mangled name of 'g' will change in C++17}} |
1081 | void h() throw() { |
1082 | g(f); // expected-error-re {{{{is not superset|no matching function}}}} |
1083 | g(q); // expected-error-re {{{{is not superset|no matching function}}}} |
1084 | } |
1085 | |
1086 | // Prior to C++17, this is OK because the exception specification is not |
1087 | // considered in this context. In C++17, we *do* perform an implicit |
1088 | // conversion (which performs initialization), and the exception specification |
1089 | // is part of the type of the parameter, so this is invalid. |
1090 | template<void() throw()> struct X {}; |
1091 | X<&f> xp; |
1092 | #if __cplusplus > 201402L |
1093 | // expected-error@-2 {{not implicitly convertible}} |
1094 | #endif |
1095 | |
1096 | template<void() throw(int)> struct Y {}; // expected-error 0-1{{ISO C++17 does not allow}} expected-note 0-1{{use 'noexcept}} |
1097 | Y<&h> yp; // ok |
1098 | } |
1099 | |
1100 | // dr93: na |
1101 | |
1102 | namespace dr94 { // dr94: yes |
1103 | struct A { static const int n = 5; }; |
1104 | int arr[A::n]; |
1105 | } |
1106 | |
1107 | namespace dr95 { // dr95: yes |
1108 | struct A; |
1109 | struct B; |
1110 | namespace N { |
1111 | class C { |
1112 | friend struct A; |
1113 | friend struct B; |
1114 | static void f(); // expected-note {{here}} |
1115 | }; |
1116 | struct A *p; // dr95::A, not dr95::N::A. |
1117 | } |
1118 | A *q = N::p; // ok, same type |
1119 | struct B { void f() { N::C::f(); } }; // expected-error {{private}} |
1120 | } |
1121 | |
1122 | namespace dr96 { // dr96: no |
1123 | struct A { |
1124 | void f(int); |
1125 | template<typename T> int f(T); |
1126 | template<typename T> struct S {}; |
1127 | } a; |
1128 | template<template<typename> class X> struct B {}; |
1129 | |
1130 | template<typename T> |
1131 | void test() { |
1132 | int k1 = a.template f<int>(0); |
1133 | // FIXME: This is ill-formed, because 'f' is not a template-id and does not |
1134 | // name a class template. |
1135 | // FIXME: What about alias templates? |
1136 | int k2 = a.template f(1); |
1137 | A::template S<int> s; |
1138 | B<A::template S> b; |
1139 | } |
1140 | } |
1141 | |
1142 | namespace dr97 { // dr97: yes |
1143 | struct A { |
1144 | static const int a = false; |
1145 | static const int b = !a; |
1146 | }; |
1147 | } |
1148 | |
1149 | namespace dr98 { // dr98: yes |
1150 | void test(int n) { |
1151 | switch (n) { |
1152 | try { // expected-note 2{{bypasses}} |
1153 | case 0: // expected-error {{cannot jump}} |
1154 | x: |
1155 | throw n; |
1156 | } catch (...) { // expected-note 2{{bypasses}} |
1157 | case 1: // expected-error {{cannot jump}} |
1158 | y: |
1159 | throw n; |
1160 | } |
1161 | case 2: |
1162 | goto x; // expected-error {{cannot jump}} |
1163 | case 3: |
1164 | goto y; // expected-error {{cannot jump}} |
1165 | } |
1166 | } |
1167 | } |
1168 | |
1169 | namespace dr99 { // dr99: sup 214 |
1170 | template<typename T> void f(T&); |
1171 | template<typename T> int &f(const T&); |
1172 | const int n = 0; |
1173 | int &r = f(n); |
1174 | } |
1175 | |