xref: /llvm-project/clang/test/CXX/drs/cwg6xx.cpp (revision 14ba3f9d07ea1664497c5d117120fb243ca221aa)
13c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++98 %s -verify=expected,cxx98-17,cxx98-14,cxx98 -fexceptions -fcxx-exceptions -pedantic-errors
23c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++11 %s -verify=expected,cxx11-20,cxx98-17,cxx11-17,cxx98-14,since-cxx11,cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
33c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++14 %s -verify=expected,cxx11-20,cxx98-17,cxx11-17,cxx98-14,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
43c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++17 %s -verify=expected,cxx11-20,cxx98-17,cxx11-17,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
53c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++20 %s -verify=expected,cxx11-20,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
63c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++23 %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
73c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++2c %s -verify=expected,since-cxx11 -fexceptions -fcxx-exceptions -pedantic-errors
8d358b2deSVlad Serebrennikov 
9d358b2deSVlad Serebrennikov #if __cplusplus == 199711L
10d358b2deSVlad Serebrennikov #define static_assert(...) __extension__ _Static_assert(__VA_ARGS__)
11d358b2deSVlad Serebrennikov // cxx98-error@-1 {{variadic macros are a C99 feature}}
12d358b2deSVlad Serebrennikov #endif
13d358b2deSVlad Serebrennikov 
14d358b2deSVlad Serebrennikov namespace cwg600 { // cwg600: 2.8
15d358b2deSVlad Serebrennikov struct S {
16d358b2deSVlad Serebrennikov   void f(int);
17d358b2deSVlad Serebrennikov 
18d358b2deSVlad Serebrennikov private:
19d358b2deSVlad Serebrennikov   void f(double); // #cwg600-f-double
20d358b2deSVlad Serebrennikov };
21d358b2deSVlad Serebrennikov 
22d358b2deSVlad Serebrennikov void g(S *sp) {
23d358b2deSVlad Serebrennikov   sp->f(2);
24d358b2deSVlad Serebrennikov   // access control is applied after overload resolution
25d358b2deSVlad Serebrennikov   sp->f(2.2);
26d358b2deSVlad Serebrennikov   // expected-error@-1 {{'f' is a private member of 'cwg600::S'}}
27d358b2deSVlad Serebrennikov   //   expected-note@#cwg600-f-double {{declared private here}}
28d358b2deSVlad Serebrennikov }
29d358b2deSVlad Serebrennikov } // namespace cwg600
30d358b2deSVlad Serebrennikov 
31d358b2deSVlad Serebrennikov namespace std {
32d358b2deSVlad Serebrennikov   struct type_info {};
33d358b2deSVlad Serebrennikov   __extension__ typedef __SIZE_TYPE__ size_t;
34d358b2deSVlad Serebrennikov } // namespace std
35d358b2deSVlad Serebrennikov 
36*14ba3f9dSVlad Serebrennikov namespace cwg601 { // cwg601: 2.7
37d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
38d358b2deSVlad Serebrennikov #define MAX __LLONG_MAX__
39d358b2deSVlad Serebrennikov #else
40d358b2deSVlad Serebrennikov #define MAX __LONG_MAX__
41d358b2deSVlad Serebrennikov #endif
42d358b2deSVlad Serebrennikov 
43d358b2deSVlad Serebrennikov #if 0x8000 < -1
44d358b2deSVlad Serebrennikov #error 0x8000 should be signed
45d358b2deSVlad Serebrennikov #endif
46d358b2deSVlad Serebrennikov 
47d358b2deSVlad Serebrennikov #if MAX > 0xFFFFFFFF && 0x80000000 < -1
48d358b2deSVlad Serebrennikov #error 0x80000000 should be signed
49d358b2deSVlad Serebrennikov #endif
50d358b2deSVlad Serebrennikov 
51d358b2deSVlad Serebrennikov #if __INT_MAX__ == 0x7FFFFFFF
52d358b2deSVlad Serebrennikov static_assert(0x80000000 < -1, "0x80000000 should be unsigned");
53d358b2deSVlad Serebrennikov #endif
54d358b2deSVlad Serebrennikov 
55d358b2deSVlad Serebrennikov #if MAX > 0xFFFFFFFFFFFFFFFF && 0x8000000000000000 < -1
56d358b2deSVlad Serebrennikov #error 0x8000000000000000 should be signed
57d358b2deSVlad Serebrennikov #endif
58d358b2deSVlad Serebrennikov 
59d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L && __LLONG_MAX__ == 0x7FFFFFFFFFFFFFFF
60d358b2deSVlad Serebrennikov static_assert(0x8000000000000000 < -1, "0x8000000000000000 should be unsigned");
61d358b2deSVlad Serebrennikov #endif
62d358b2deSVlad Serebrennikov 
63d358b2deSVlad Serebrennikov #undef MAX
64463e61a0SVlad Serebrennikov } // namespace cwg601
65d358b2deSVlad Serebrennikov 
66*14ba3f9dSVlad Serebrennikov namespace cwg602 { // cwg602: 2.7
67d358b2deSVlad Serebrennikov   template<class T> struct A {
68d358b2deSVlad Serebrennikov     template<class U> friend struct A;
69d358b2deSVlad Serebrennikov   };
70d358b2deSVlad Serebrennikov 
71d358b2deSVlad Serebrennikov   template<class T> struct B {
72d358b2deSVlad Serebrennikov     class C {
73d358b2deSVlad Serebrennikov       template<class U> friend struct B;
74d358b2deSVlad Serebrennikov       typedef int type;
75d358b2deSVlad Serebrennikov     };
76d358b2deSVlad Serebrennikov     typename C::type ct; // ok, befriended
77d358b2deSVlad Serebrennikov   };
78d358b2deSVlad Serebrennikov   B<int> b;
79463e61a0SVlad Serebrennikov } // namespace cwg602
80d358b2deSVlad Serebrennikov 
81*14ba3f9dSVlad Serebrennikov namespace cwg603 { // cwg603: 3.1
82d358b2deSVlad Serebrennikov   template<unsigned char> struct S {};
83d358b2deSVlad Serebrennikov   typedef S<'\001'> S1;
84d358b2deSVlad Serebrennikov   typedef S<(1ul << __CHAR_BIT__) + 1> S1;
85*14ba3f9dSVlad Serebrennikov   // since-cxx11-error@-1 {{non-type template argument evaluates to 257, which cannot be narrowed to type 'unsigned char'}}
86463e61a0SVlad Serebrennikov } // namespace cwg603
87d358b2deSVlad Serebrennikov 
88d358b2deSVlad Serebrennikov // cwg604: na
89d358b2deSVlad Serebrennikov // cwg605 is in cwg605.cpp
90d358b2deSVlad Serebrennikov 
91d358b2deSVlad Serebrennikov namespace cwg606 { // cwg606: 3.0
92d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
93d358b2deSVlad Serebrennikov   template<typename T> struct S {};
94d358b2deSVlad Serebrennikov   template<typename T> void f(S<T> &&); // #cwg606-f
95d358b2deSVlad Serebrennikov   template<typename T> void g(T &&);
96d358b2deSVlad Serebrennikov   template<typename T> void h(const T &&); // #cwg606-h
97d358b2deSVlad Serebrennikov 
98d358b2deSVlad Serebrennikov   void test(S<int> s) {
99d358b2deSVlad Serebrennikov     f(s);
100d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{no matching function for call to 'f'}}
101d358b2deSVlad Serebrennikov     //   since-cxx11-note@#cwg606-f {{candidate function [with T = int] not viable: expects an rvalue for 1st argument}}
102d358b2deSVlad Serebrennikov     g(s);
103d358b2deSVlad Serebrennikov     h(s);
104d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{no matching function for call to 'h'}}
105d358b2deSVlad Serebrennikov     //   since-cxx11-note@#cwg606-h {{candidate function [with T = cwg606::S<int>] not viable: expects an rvalue for 1st argument}}
106d358b2deSVlad Serebrennikov 
107d358b2deSVlad Serebrennikov     g(test);
108d358b2deSVlad Serebrennikov     h(test); // ok, an rvalue reference can bind to a function lvalue
109d358b2deSVlad Serebrennikov   }
110d358b2deSVlad Serebrennikov #endif
111463e61a0SVlad Serebrennikov } // namespace cwg606
112d358b2deSVlad Serebrennikov 
113*14ba3f9dSVlad Serebrennikov namespace cwg607 { // cwg607: 2.7
114d358b2deSVlad Serebrennikov namespace example1 {
115d358b2deSVlad Serebrennikov struct Y {};
116d358b2deSVlad Serebrennikov 
117d358b2deSVlad Serebrennikov template <typename T> struct X : public virtual Y {};
118d358b2deSVlad Serebrennikov 
119d358b2deSVlad Serebrennikov template <typename T> class A : public X<T> {
120d358b2deSVlad Serebrennikov   template <typename S> A(S) : S() {}
121d358b2deSVlad Serebrennikov };
122d358b2deSVlad Serebrennikov 
123d358b2deSVlad Serebrennikov template A<int>::A(Y);
124d358b2deSVlad Serebrennikov } // namespace example1
125d358b2deSVlad Serebrennikov 
126d358b2deSVlad Serebrennikov namespace example2 {
127d358b2deSVlad Serebrennikov namespace N {
128d358b2deSVlad Serebrennikov struct B {
129d358b2deSVlad Serebrennikov   B(int);
130d358b2deSVlad Serebrennikov };
131d358b2deSVlad Serebrennikov typedef B typedef_B;
132d358b2deSVlad Serebrennikov struct D : B {
133d358b2deSVlad Serebrennikov   D();
134d358b2deSVlad Serebrennikov };
135d358b2deSVlad Serebrennikov } // namespace N
136d358b2deSVlad Serebrennikov 
137d358b2deSVlad Serebrennikov N::D::D() : typedef_B(0) {}
138d358b2deSVlad Serebrennikov } // namespace example2
139d358b2deSVlad Serebrennikov } // namespace cwg607
140d358b2deSVlad Serebrennikov 
141*14ba3f9dSVlad Serebrennikov namespace cwg608 { // cwg608: 2.7
142d358b2deSVlad Serebrennikov   struct A { virtual void f(); };
143d358b2deSVlad Serebrennikov   struct B : A {};
144d358b2deSVlad Serebrennikov   struct C : A { void f(); };
145d358b2deSVlad Serebrennikov   struct D : B, C {};
146463e61a0SVlad Serebrennikov } // namespace cwg608
147d358b2deSVlad Serebrennikov 
148*14ba3f9dSVlad Serebrennikov namespace cwg610 { // cwg610: 2.7
149*14ba3f9dSVlad Serebrennikov static_assert(-0u == 0u, "");
150*14ba3f9dSVlad Serebrennikov } // namespace cwg610
151d358b2deSVlad Serebrennikov 
152*14ba3f9dSVlad Serebrennikov namespace cwg611 { // cwg611: 2.7
153d358b2deSVlad Serebrennikov   int k;
154d358b2deSVlad Serebrennikov   struct S { int &r; } s = { k ? k : k };
155463e61a0SVlad Serebrennikov } // namespace cwg611
156d358b2deSVlad Serebrennikov 
157d358b2deSVlad Serebrennikov // cwg612: na
158d358b2deSVlad Serebrennikov 
159*14ba3f9dSVlad Serebrennikov namespace cwg613 { // cwg613: 3.1 c++11
160d358b2deSVlad Serebrennikov   // see also n2253
161d358b2deSVlad Serebrennikov   struct A { int n; static void f(); };
162d358b2deSVlad Serebrennikov   int f(int);
163d358b2deSVlad Serebrennikov   struct B { virtual void f(); };
164d358b2deSVlad Serebrennikov   B &g(int);
165d358b2deSVlad Serebrennikov 
166d358b2deSVlad Serebrennikov   int an1 = sizeof(A::n);
167d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
168d358b2deSVlad Serebrennikov   int an2 = sizeof(A::n + 1); // valid per cwg850
169d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
170d358b2deSVlad Serebrennikov   int an3 = sizeof A::n;
171d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
172d358b2deSVlad Serebrennikov   int an4 = sizeof(f(A::n));
173d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
174d358b2deSVlad Serebrennikov   int an5 = sizeof(g(A::n));
175d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
176d358b2deSVlad Serebrennikov   const std::type_info &an6 = typeid(A::n);
177d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
178d358b2deSVlad Serebrennikov   const std::type_info &an7 = typeid(A::n + 1);
179d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
180d358b2deSVlad Serebrennikov   const std::type_info &an8 = typeid(f(A::n));
181d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
182d358b2deSVlad Serebrennikov   const std::type_info &an9 = typeid(g(A::n));
183d358b2deSVlad Serebrennikov   // expected-error@-1 {{invalid use of non-static data member 'n'}}
184d358b2deSVlad Serebrennikov 
185d358b2deSVlad Serebrennikov   void A::f() {
186d358b2deSVlad Serebrennikov     int an1 = sizeof n;
187d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{invalid use of member 'n' in static member function}}
188d358b2deSVlad Serebrennikov     const std::type_info &an2 = typeid(n + 1);
189d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{invalid use of member 'n' in static member function}}
190d358b2deSVlad Serebrennikov     const std::type_info &an3 = typeid(g(n));
191d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{invalid use of member 'n' in static member function}}
192d358b2deSVlad Serebrennikov     // since-cxx11-error@-2 {{invalid use of non-static data member 'n'}}
193d358b2deSVlad Serebrennikov   }
194463e61a0SVlad Serebrennikov } // namespace cwg613
195d358b2deSVlad Serebrennikov 
196*14ba3f9dSVlad Serebrennikov namespace cwg614 { // cwg614: 2.7
197*14ba3f9dSVlad Serebrennikov static_assert((-1) / 2 == 0, "");
198d358b2deSVlad Serebrennikov static_assert((-1) % 2 == -1, "");
199*14ba3f9dSVlad Serebrennikov } // namespace cwg614
200d358b2deSVlad Serebrennikov 
201*14ba3f9dSVlad Serebrennikov namespace cwg615 { // cwg615: 2.7
202d358b2deSVlad Serebrennikov   int f();
203d358b2deSVlad Serebrennikov   static int n = f();
204463e61a0SVlad Serebrennikov } // namespace cwg615
205d358b2deSVlad Serebrennikov 
206d358b2deSVlad Serebrennikov namespace cwg616 { // cwg616: 4
207d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
208d358b2deSVlad Serebrennikov   struct S { int n; } s;
209d358b2deSVlad Serebrennikov   S f();
210d358b2deSVlad Serebrennikov   using T = decltype((S().n));
211d358b2deSVlad Serebrennikov   using T = decltype((static_cast<S&&>(s).n));
212d358b2deSVlad Serebrennikov   using T = decltype((f().n));
213d358b2deSVlad Serebrennikov   using T = decltype(S().*&S::n);
214d358b2deSVlad Serebrennikov   using T = decltype(static_cast<S&&>(s).*&S::n);
215d358b2deSVlad Serebrennikov   using T = decltype(f().*&S::n);
216d358b2deSVlad Serebrennikov   using T = int&&;
217d358b2deSVlad Serebrennikov 
218d358b2deSVlad Serebrennikov   using U = decltype(S().n);
219d358b2deSVlad Serebrennikov   using U = decltype(static_cast<S&&>(s).n);
220d358b2deSVlad Serebrennikov   using U = int;
221d358b2deSVlad Serebrennikov #endif
222463e61a0SVlad Serebrennikov } // namespace cwg616
223d358b2deSVlad Serebrennikov 
224*14ba3f9dSVlad Serebrennikov namespace cwg618 { // cwg618: 2.7
225d358b2deSVlad Serebrennikov #if (unsigned)-1 > 0
226d358b2deSVlad Serebrennikov #error wrong
227d358b2deSVlad Serebrennikov #endif
228463e61a0SVlad Serebrennikov } // namespace cwg618
229d358b2deSVlad Serebrennikov 
230*14ba3f9dSVlad Serebrennikov namespace cwg619 { // cwg619: 3.4
231d358b2deSVlad Serebrennikov   extern int x[10];
232d358b2deSVlad Serebrennikov   struct S { static int x[10]; };
233d358b2deSVlad Serebrennikov 
234d358b2deSVlad Serebrennikov   int x[];
235d358b2deSVlad Serebrennikov   static_assert(sizeof(x) == sizeof(int) * 10, "");
236d358b2deSVlad Serebrennikov   extern int x[];
237d358b2deSVlad Serebrennikov   static_assert(sizeof(x) == sizeof(int) * 10, "");
238d358b2deSVlad Serebrennikov 
239d358b2deSVlad Serebrennikov   int S::x[];
240d358b2deSVlad Serebrennikov   static_assert(sizeof(S::x) == sizeof(int) * 10, "");
241d358b2deSVlad Serebrennikov 
242d358b2deSVlad Serebrennikov   void f() {
243d358b2deSVlad Serebrennikov     extern int x[];
244d358b2deSVlad Serebrennikov     sizeof(x);
245d358b2deSVlad Serebrennikov     // expected-error@-1 {{invalid application of 'sizeof' to an incomplete type 'int[]'}}
246d358b2deSVlad Serebrennikov   }
247463e61a0SVlad Serebrennikov } // namespace cwg619
248d358b2deSVlad Serebrennikov 
249d358b2deSVlad Serebrennikov // cwg620: dup 568
250d358b2deSVlad Serebrennikov 
251*14ba3f9dSVlad Serebrennikov namespace cwg621 { // cwg621: 2.7
252d358b2deSVlad Serebrennikov   template<typename T> T f();
253d358b2deSVlad Serebrennikov   template<> int f() {} // #cwg621-f
254d358b2deSVlad Serebrennikov   template<> int f<int>() {}
255d358b2deSVlad Serebrennikov   // expected-error@-1 {{redefinition of 'f<int>'}}
256d358b2deSVlad Serebrennikov   //   expected-note@#cwg621-f {{previous definition is here}}
257463e61a0SVlad Serebrennikov } // namespace cwg621
258d358b2deSVlad Serebrennikov 
259d358b2deSVlad Serebrennikov // cwg623: na
260d358b2deSVlad Serebrennikov // FIXME: Add documentation saying we allow invalid pointer values.
261d358b2deSVlad Serebrennikov 
262d358b2deSVlad Serebrennikov // cwg624 needs a libc++abi test.
263d358b2deSVlad Serebrennikov 
264*14ba3f9dSVlad Serebrennikov namespace cwg625 { // cwg625: 2.9
265d358b2deSVlad Serebrennikov   template<typename T> struct A {};
266d358b2deSVlad Serebrennikov   A<auto> x = A<int>();
267d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{'auto' type specifier is a C++11 extension}}
268d358b2deSVlad Serebrennikov   // expected-error@-2 {{'auto' not allowed in template argument}}
269d358b2deSVlad Serebrennikov   void f(int);
270d358b2deSVlad Serebrennikov   void (*p)(auto) = f;
271d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{'auto' type specifier is a C++11 extension}}
272d358b2deSVlad Serebrennikov   // expected-error@-2 {{'auto' not allowed in function prototype}}
273463e61a0SVlad Serebrennikov } // namespace cwg625
274d358b2deSVlad Serebrennikov 
275*14ba3f9dSVlad Serebrennikov namespace cwg626 { // cwg626: 2.7
276d358b2deSVlad Serebrennikov #define STR(x) #x
277d358b2deSVlad Serebrennikov   char c[2] = STR(c); // ok, type matches
278d358b2deSVlad Serebrennikov   wchar_t w[2] = STR(w);
279d358b2deSVlad Serebrennikov   // expected-error@-1 {{initializing wide char array with non-wide string literal}}
280463e61a0SVlad Serebrennikov } // namespace cwg626
281d358b2deSVlad Serebrennikov 
282*14ba3f9dSVlad Serebrennikov namespace cwg627 { // cwg627: 2.7
283d358b2deSVlad Serebrennikov   void f() {
284d358b2deSVlad Serebrennikov     // FIXME: emitted diagnostic have a room for improvement
285d358b2deSVlad Serebrennikov     true a = 0;
286d358b2deSVlad Serebrennikov     // expected-error@-1 {{expected ';' after expression}}
287d358b2deSVlad Serebrennikov     // expected-error@-2 {{use of undeclared identifier 'a'}}
288d358b2deSVlad Serebrennikov     // expected-warning@-3 {{expression result unused}}
289d358b2deSVlad Serebrennikov   }
290463e61a0SVlad Serebrennikov } // namespace cwg627
291d358b2deSVlad Serebrennikov 
292d358b2deSVlad Serebrennikov // cwg628: na
293d358b2deSVlad Serebrennikov 
294d358b2deSVlad Serebrennikov namespace cwg629 { // cwg629: 2.9
295d358b2deSVlad Serebrennikov   typedef int T;
296d358b2deSVlad Serebrennikov   int n = 1;
297d358b2deSVlad Serebrennikov   void f() {
298d358b2deSVlad Serebrennikov     auto T = 2; // #cwg629-T
299d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{expected unqualified-id}}
300d358b2deSVlad Serebrennikov 
301d358b2deSVlad Serebrennikov     auto T(n);
302d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{redefinition of 'T'}}
303d358b2deSVlad Serebrennikov     //   since-cxx11-note@#cwg629-T {{previous definition is here}}
304d358b2deSVlad Serebrennikov   }
305463e61a0SVlad Serebrennikov } // namespace cwg629
306d358b2deSVlad Serebrennikov 
307*14ba3f9dSVlad Serebrennikov namespace cwg630 { // cwg630: 2.7
308d358b2deSVlad Serebrennikov const bool MB_EQ_WC =
309d358b2deSVlad Serebrennikov     ' ' == L' ' && '\t' == L'\t' && '\v' == L'\v' && '\r' == L'\r' &&
310d358b2deSVlad Serebrennikov     '\n' == L'\n' && //
311d358b2deSVlad Serebrennikov     'a' == L'a' && 'b' == L'b' && 'c' == L'c' && 'd' == L'd' && 'e' == L'e' &&
312d358b2deSVlad Serebrennikov     'f' == L'f' && 'g' == L'g' && 'h' == L'h' && 'i' == L'i' && 'j' == L'j' &&
313d358b2deSVlad Serebrennikov     'k' == L'k' && 'l' == L'l' && 'm' == L'm' && 'n' == L'n' && 'o' == L'o' &&
314d358b2deSVlad Serebrennikov     'p' == L'p' && 'q' == L'q' && 'r' == L'r' && 's' == L's' && 't' == L't' &&
315d358b2deSVlad Serebrennikov     'u' == L'u' && 'v' == L'v' && 'w' == L'w' && 'x' == L'x' && 'y' == L'y' &&
316d358b2deSVlad Serebrennikov     'z' == L'z' && //
317d358b2deSVlad Serebrennikov     'A' == L'A' && 'B' == L'B' && 'C' == L'C' && 'D' == L'D' && 'E' == L'E' &&
318d358b2deSVlad Serebrennikov     'F' == L'F' && 'G' == L'G' && 'H' == L'H' && 'I' == L'I' && 'J' == L'J' &&
319d358b2deSVlad Serebrennikov     'K' == L'K' && 'L' == L'L' && 'M' == L'M' && 'N' == L'N' && 'O' == L'O' &&
320d358b2deSVlad Serebrennikov     'P' == L'P' && 'Q' == L'Q' && 'R' == L'R' && 'S' == L'S' && 'T' == L'T' &&
321d358b2deSVlad Serebrennikov     'U' == L'U' && 'V' == L'V' && 'W' == L'W' && 'X' == L'X' && 'Y' == L'Y' &&
322d358b2deSVlad Serebrennikov     'Z' == L'Z' && //
323d358b2deSVlad Serebrennikov     '0' == L'0' && '1' == L'1' && '2' == L'2' && '3' == L'3' && '4' == L'4' &&
324d358b2deSVlad Serebrennikov     '5' == L'5' && '6' == L'6' && '7' == L'7' && '8' == L'8' &&
325d358b2deSVlad Serebrennikov     '9' == L'9' && //
326d358b2deSVlad Serebrennikov     '_' == L'_' && '{' == L'{' && '}' == L'}' && '[' == L'[' && ']' == L']' &&
327d358b2deSVlad Serebrennikov     '#' == L'#' && '(' == L'(' && ')' == L')' && '<' == L'<' && '>' == L'>' &&
328d358b2deSVlad Serebrennikov     '%' == L'%' && ':' == L':' && ';' == L';' && '.' == L'.' && '?' == L'?' &&
329d358b2deSVlad Serebrennikov     '*' == L'*' && '+' == L'+' && '-' == L'-' && '/' == L'/' && '^' == L'^' &&
330d358b2deSVlad Serebrennikov     '&' == L'&' && '|' == L'|' && '~' == L'~' && '!' == L'!' && '=' == L'=' &&
331d358b2deSVlad Serebrennikov     ',' == L',' && '\\' == L'\\' && '"' == L'"' && '\'' == L'\'';
332d358b2deSVlad Serebrennikov #if __STDC_MB_MIGHT_NEQ_WC__
333d358b2deSVlad Serebrennikov #ifndef __FreeBSD__ // PR22208, FreeBSD expects us to give a bad (but conforming) answer here.
334d358b2deSVlad Serebrennikov static_assert(!MB_EQ_WC, "__STDC_MB_MIGHT_NEQ_WC__ but all basic source characters have same representation");
335d358b2deSVlad Serebrennikov #endif
336d358b2deSVlad Serebrennikov #else
337d358b2deSVlad Serebrennikov static_assert(MB_EQ_WC, "!__STDC_MB_MIGHT_NEQ_WC__ but some character differs");
338d358b2deSVlad Serebrennikov #endif
339463e61a0SVlad Serebrennikov } // namespace cwg630
340d358b2deSVlad Serebrennikov 
341d358b2deSVlad Serebrennikov // cwg631: na
342d358b2deSVlad Serebrennikov 
343*14ba3f9dSVlad Serebrennikov namespace cwg632 { // cwg632: 2.7
344d358b2deSVlad Serebrennikov   struct S { int n; } s = {{5}};
345d358b2deSVlad Serebrennikov   // expected-warning@-1 {{braces around scalar initializer}}
346463e61a0SVlad Serebrennikov } // namespace cwg632
347d358b2deSVlad Serebrennikov 
348d358b2deSVlad Serebrennikov // cwg633: na
349d358b2deSVlad Serebrennikov // see also n2993
350d358b2deSVlad Serebrennikov 
351*14ba3f9dSVlad Serebrennikov namespace cwg634 { // cwg634: 2.7
352d358b2deSVlad Serebrennikov   struct S { S(); S(const S&); virtual void f(); ~S(); };
353d358b2deSVlad Serebrennikov   int f(...);
354d358b2deSVlad Serebrennikov   char f(int);
355d358b2deSVlad Serebrennikov   template<typename T> int (&g(T))[sizeof f(T())];
356d358b2deSVlad Serebrennikov   int (&a)[sizeof(int)] = g(S());
357d358b2deSVlad Serebrennikov   int (&b)[1] = g(0);
358d358b2deSVlad Serebrennikov   int k = f(S());
359d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{cannot pass object of non-POD type 'S' through variadic function; call will abort at runtime}}
360d358b2deSVlad Serebrennikov   // since-cxx11-error@-2 {{cannot pass object of non-trivial type 'S' through variadic function; call will abort at runtime}}
361463e61a0SVlad Serebrennikov } // namespace cwg634
362d358b2deSVlad Serebrennikov 
363*14ba3f9dSVlad Serebrennikov namespace cwg635 { // cwg635: 2.7
364d358b2deSVlad Serebrennikov   template<typename T> struct A { A(); ~A(); };
365d358b2deSVlad Serebrennikov   template<typename T> A<T>::A<T>() {}
366d358b2deSVlad Serebrennikov   // expected-error@-1 {{out-of-line constructor for 'A' cannot have template arguments}}
367d358b2deSVlad Serebrennikov   template<typename T> A<T>::~A<T>() {}
368d358b2deSVlad Serebrennikov 
369d358b2deSVlad Serebrennikov   template<typename T> struct B { B(); ~B(); };
370d358b2deSVlad Serebrennikov   template<typename T> B<T>::B() {}
371d358b2deSVlad Serebrennikov   template<typename T> B<T>::~B() {}
372d358b2deSVlad Serebrennikov 
373d358b2deSVlad Serebrennikov   struct C { template<typename T> C(); C(); };
374d358b2deSVlad Serebrennikov   template<typename T> C::C() {}
375d358b2deSVlad Serebrennikov   C::C() {}
376d358b2deSVlad Serebrennikov   template<> C::C<int>() {}
377d358b2deSVlad Serebrennikov   // expected-error@-1 {{qualified reference to 'C' is a constructor name rather than a type in this context}}
378d358b2deSVlad Serebrennikov   // expected-error@-2 {{expected unqualified-id}}
379d358b2deSVlad Serebrennikov   /*FIXME: needed for error recovery:*/;
380d358b2deSVlad Serebrennikov 
381d358b2deSVlad Serebrennikov   template<typename T> struct D { template<typename U> D(); D(); };
382d358b2deSVlad Serebrennikov   template<typename T> D<T>::D() {} // #cwg635-D
383d358b2deSVlad Serebrennikov   template<typename T> template<typename U> D<T>::D() {}
384d358b2deSVlad Serebrennikov   template<typename T> D<T>::D<T>() {} // #cwg635-D-T
385d358b2deSVlad Serebrennikov   // expected-error@#cwg635-D-T {{out-of-line constructor for 'D' cannot have template arguments}}
386d358b2deSVlad Serebrennikov   // expected-error@#cwg635-D-T {{redefinition of 'D<T>'}}
387d358b2deSVlad Serebrennikov   //   expected-note@#cwg635-D {{previous definition is here}}
388463e61a0SVlad Serebrennikov } // namespace cwg635
389d358b2deSVlad Serebrennikov 
390*14ba3f9dSVlad Serebrennikov namespace cwg637 { // cwg637: 3.0
391d358b2deSVlad Serebrennikov   void f(int i) {
392d358b2deSVlad Serebrennikov     i = ++i + 1;
393d358b2deSVlad Serebrennikov     i = i++ + 1;
394d358b2deSVlad Serebrennikov     // cxx98-14-warning@-1 {{multiple unsequenced modifications to 'i'}}
395d358b2deSVlad Serebrennikov   }
396463e61a0SVlad Serebrennikov } // namespace cwg637
397d358b2deSVlad Serebrennikov 
398d358b2deSVlad Serebrennikov namespace cwg638 { // cwg638: no
399d358b2deSVlad Serebrennikov   template<typename T> struct A {
400d358b2deSVlad Serebrennikov     struct B;
401d358b2deSVlad Serebrennikov     void f();
402d358b2deSVlad Serebrennikov     void g();
403d358b2deSVlad Serebrennikov     struct C {
404d358b2deSVlad Serebrennikov       void h();
405d358b2deSVlad Serebrennikov     };
406d358b2deSVlad Serebrennikov   };
407d358b2deSVlad Serebrennikov 
408d358b2deSVlad Serebrennikov   class X {
409d358b2deSVlad Serebrennikov     typedef int type;
410d358b2deSVlad Serebrennikov     template<class T> friend struct A<T>::B;
411d358b2deSVlad Serebrennikov     // expected-warning@-1 {{dependent nested name specifier 'A<T>::' for friend class declaration is not supported; turning off access control for 'X'}}
412d358b2deSVlad Serebrennikov     template<class T> friend void A<T>::f();
413d358b2deSVlad Serebrennikov     // expected-warning@-1 {{dependent nested name specifier 'A<T>::' for friend class declaration is not supported; turning off access control for 'X'}}
414d358b2deSVlad Serebrennikov     template<class T> friend void A<T>::g();
415d358b2deSVlad Serebrennikov     // expected-warning@-1 {{dependent nested name specifier 'A<T>::' for friend class declaration is not supported; turning off access control for 'X'}}
416d358b2deSVlad Serebrennikov     template<class T> friend void A<T>::C::h();
417d358b2deSVlad Serebrennikov     // expected-warning@-1 {{dependent nested name specifier 'A<T>::C::' for friend class declaration is not supported; turning off access control for 'X'}}
418d358b2deSVlad Serebrennikov   };
419d358b2deSVlad Serebrennikov 
420d358b2deSVlad Serebrennikov   template<> struct A<int> {
421d358b2deSVlad Serebrennikov     X::type a; // FIXME: private
422d358b2deSVlad Serebrennikov     struct B {
423d358b2deSVlad Serebrennikov       X::type b; // ok
424d358b2deSVlad Serebrennikov     };
425d358b2deSVlad Serebrennikov     int f() { X::type c; } // FIXME: private
426d358b2deSVlad Serebrennikov     void g() { X::type d; } // ok
427d358b2deSVlad Serebrennikov     struct D {
428d358b2deSVlad Serebrennikov       void h() { X::type e; } // FIXME: private
429d358b2deSVlad Serebrennikov     };
430d358b2deSVlad Serebrennikov   };
431463e61a0SVlad Serebrennikov } // namespace cwg638
432d358b2deSVlad Serebrennikov 
433d358b2deSVlad Serebrennikov namespace cwg639 { // cwg639: 3.3
434d358b2deSVlad Serebrennikov   void f(int i) {
435d358b2deSVlad Serebrennikov     void((i = 0) + (i = 0));
436d358b2deSVlad Serebrennikov     // expected-warning@-1 {{multiple unsequenced modifications to 'i'}}
437d358b2deSVlad Serebrennikov   }
438463e61a0SVlad Serebrennikov } // namespace cwg639
439d358b2deSVlad Serebrennikov 
440*14ba3f9dSVlad Serebrennikov namespace cwg641 { // cwg641: 2.7
441d358b2deSVlad Serebrennikov   namespace std_example {
442d358b2deSVlad Serebrennikov     struct abc;
443d358b2deSVlad Serebrennikov 
444d358b2deSVlad Serebrennikov     struct xyz {
445d358b2deSVlad Serebrennikov       xyz(); // #cwg641-xyz-ctor
446d358b2deSVlad Serebrennikov       xyz(xyz &); // #cwg641-xyz-copy-ctor
447d358b2deSVlad Serebrennikov 
448d358b2deSVlad Serebrennikov       operator xyz &() = delete;
449d358b2deSVlad Serebrennikov       // expected-warning@-1 {{conversion function converting 'cwg641::std_example::xyz' to itself will never be used}}
450d358b2deSVlad Serebrennikov       // cxx98-error@-2 {{deleted function definitions are a C++11 extension}}
451d358b2deSVlad Serebrennikov       operator abc &() = delete;
452d358b2deSVlad Serebrennikov       // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
453d358b2deSVlad Serebrennikov     };
454d358b2deSVlad Serebrennikov 
455d358b2deSVlad Serebrennikov     struct abc : xyz {};
456d358b2deSVlad Serebrennikov 
457d358b2deSVlad Serebrennikov     template<typename T>
458d358b2deSVlad Serebrennikov     void use(T &); // #cwg641-use
459d358b2deSVlad Serebrennikov     void test() {
460d358b2deSVlad Serebrennikov       use<xyz>(xyz());
461d358b2deSVlad Serebrennikov       // expected-error@-1 {{no matching function for call to 'use'}}
462d358b2deSVlad Serebrennikov       //   expected-note@#cwg641-use {{candidate function template not viable: expects an lvalue for 1st argument}}
463d358b2deSVlad Serebrennikov       use<const xyz>(xyz());
464d358b2deSVlad Serebrennikov       // cxx98-error@-1 {{no viable constructor copying parameter of type 'xyz'; C++98 requires a copy constructor when binding a reference to a temporary}}
465d358b2deSVlad Serebrennikov       //   cxx98-note@#cwg641-xyz-copy-ctor {{candidate constructor not viable: expects an lvalue for 1st argument}}
466d358b2deSVlad Serebrennikov       //   cxx98-note@#cwg641-xyz-ctor {{candidate constructor not viable: requires 0 arguments, but 1 was provided}}
467d358b2deSVlad Serebrennikov     }
468d358b2deSVlad Serebrennikov   }
469d358b2deSVlad Serebrennikov 
470d358b2deSVlad Serebrennikov   template<typename T> struct error { typedef typename T::error type; };
471d358b2deSVlad Serebrennikov 
472d358b2deSVlad Serebrennikov   struct A {
473d358b2deSVlad Serebrennikov     template<typename T, typename error<T>::type = 0> operator T() const;
474d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}}
475d358b2deSVlad Serebrennikov   };
476d358b2deSVlad Serebrennikov   A a;
477d358b2deSVlad Serebrennikov   void f(A&); // #cwg641-f
478d358b2deSVlad Serebrennikov   void g(const A ca) {
479d358b2deSVlad Serebrennikov     f(A());
480d358b2deSVlad Serebrennikov     // expected-error@-1 {{no matching function for call to 'f'}}
481d358b2deSVlad Serebrennikov     //   expected-note@#cwg641-f {{candidate function not viable: expects an lvalue for 1st argument}}
482d358b2deSVlad Serebrennikov     f(ca);
483d358b2deSVlad Serebrennikov     // expected-error@-1 {{no matching function for call to 'f'}}
484d358b2deSVlad Serebrennikov     //   expected-note@#cwg641-f {{candidate function not viable: 1st argument ('const A') would lose const qualifier}}
485d358b2deSVlad Serebrennikov     (void)A();
486d358b2deSVlad Serebrennikov     (void)ca;
487d358b2deSVlad Serebrennikov   }
488463e61a0SVlad Serebrennikov } // namespace cwg641
489d358b2deSVlad Serebrennikov 
490*14ba3f9dSVlad Serebrennikov namespace cwg642 { // cwg642: 2.7
491d358b2deSVlad Serebrennikov   void f() {
492d358b2deSVlad Serebrennikov     const int i = 2;
493d358b2deSVlad Serebrennikov     {
494d358b2deSVlad Serebrennikov       char i[i];
495d358b2deSVlad Serebrennikov       static_assert(sizeof(i) == 2, "");
496d358b2deSVlad Serebrennikov     }
497d358b2deSVlad Serebrennikov   }
498d358b2deSVlad Serebrennikov 
499d358b2deSVlad Serebrennikov   struct s { int a; };
500d358b2deSVlad Serebrennikov   void g(int s) {
501d358b2deSVlad Serebrennikov     struct s *p = new struct s;
502d358b2deSVlad Serebrennikov     p->a = s;
503d358b2deSVlad Serebrennikov   }
504463e61a0SVlad Serebrennikov } // namespace cwg642
505d358b2deSVlad Serebrennikov 
506d358b2deSVlad Serebrennikov namespace cwg643 { // cwg643: 3.2
507463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
508d358b2deSVlad Serebrennikov   struct A {
509d358b2deSVlad Serebrennikov     int x;
510d358b2deSVlad Serebrennikov     auto f() -> decltype(this->x);
511d358b2deSVlad Serebrennikov     auto f(A &a) -> decltype(a.x);
512d358b2deSVlad Serebrennikov     auto g() -> decltype(x);
513d358b2deSVlad Serebrennikov     auto h() -> decltype(this->y);
514d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{no member named 'y' in 'cwg643::A'}}
515d358b2deSVlad Serebrennikov     auto h(A &a) -> decltype(a.y);
516d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{no member named 'y' in 'cwg643::A'}}
517d358b2deSVlad Serebrennikov     auto i() -> decltype(y);
518d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{use of undeclared identifier 'y'}}
519d358b2deSVlad Serebrennikov     int y;
520d358b2deSVlad Serebrennikov   };
521d358b2deSVlad Serebrennikov #endif
522463e61a0SVlad Serebrennikov } // namespace cwg643
523d358b2deSVlad Serebrennikov 
524d358b2deSVlad Serebrennikov namespace cwg644 { // cwg644: partial
525463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
526d358b2deSVlad Serebrennikov   struct A {
527d358b2deSVlad Serebrennikov     A() = default;
528d358b2deSVlad Serebrennikov     int x, y;
529d358b2deSVlad Serebrennikov   };
530d358b2deSVlad Serebrennikov   static_assert(__is_literal_type(A), "");
531d358b2deSVlad Serebrennikov 
532d358b2deSVlad Serebrennikov   struct B : A {};
533d358b2deSVlad Serebrennikov   static_assert(__is_literal_type(B), "");
534d358b2deSVlad Serebrennikov 
535d358b2deSVlad Serebrennikov   struct C : virtual A {};
536d358b2deSVlad Serebrennikov   static_assert(!__is_literal_type(C), "");
537d358b2deSVlad Serebrennikov 
538d358b2deSVlad Serebrennikov   struct D { C c; };
539d358b2deSVlad Serebrennikov   static_assert(!__is_literal_type(D), "");
540d358b2deSVlad Serebrennikov 
541d358b2deSVlad Serebrennikov   // FIXME: According to CWG644, E<C> is a literal type despite having virtual
542d358b2deSVlad Serebrennikov   // base classes. This appears to be a wording defect.
543d358b2deSVlad Serebrennikov   template<typename T>
544d358b2deSVlad Serebrennikov   struct E : T {
545d358b2deSVlad Serebrennikov     constexpr E() = default;
546d358b2deSVlad Serebrennikov   };
547d358b2deSVlad Serebrennikov   static_assert(!__is_literal_type(E<C>), "");
548d358b2deSVlad Serebrennikov #endif
549463e61a0SVlad Serebrennikov } // namespace cwg644
550d358b2deSVlad Serebrennikov 
551d358b2deSVlad Serebrennikov // cwg645 increases permission to optimize; it's not clear that it's possible to
552d358b2deSVlad Serebrennikov // test for this.
553d358b2deSVlad Serebrennikov // cwg645: na
554d358b2deSVlad Serebrennikov 
555d358b2deSVlad Serebrennikov namespace cwg646 { // cwg646: sup 981
556463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
557d358b2deSVlad Serebrennikov   struct A {
558d358b2deSVlad Serebrennikov     constexpr A(const A&) = default; // ok
559d358b2deSVlad Serebrennikov   };
560d358b2deSVlad Serebrennikov 
561d358b2deSVlad Serebrennikov   struct B {
562d358b2deSVlad Serebrennikov     constexpr B() {}
563d358b2deSVlad Serebrennikov     B(B&);
564d358b2deSVlad Serebrennikov   };
565d358b2deSVlad Serebrennikov   constexpr B b = {}; // ok
566d358b2deSVlad Serebrennikov #endif
567463e61a0SVlad Serebrennikov } // namespace cwg646
568d358b2deSVlad Serebrennikov 
569d358b2deSVlad Serebrennikov namespace cwg647 { // cwg647: 3.1
570463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
571d358b2deSVlad Serebrennikov   // This is partially superseded by cwg1358.
572d358b2deSVlad Serebrennikov   struct A {
573d358b2deSVlad Serebrennikov     constexpr virtual void f() const;
574d358b2deSVlad Serebrennikov     constexpr virtual void g() const {}
575d358b2deSVlad Serebrennikov     // cxx11-17-error@-1 {{virtual function cannot be constexpr}}
576d358b2deSVlad Serebrennikov   };
577d358b2deSVlad Serebrennikov 
578d358b2deSVlad Serebrennikov   struct X { virtual void f() const; }; // #cwg647-f
579d358b2deSVlad Serebrennikov   struct B : X {
580d358b2deSVlad Serebrennikov     constexpr void f() const {}
581d358b2deSVlad Serebrennikov     // cxx11-17-error@-1 {{virtual function cannot be constexpr}}
582d358b2deSVlad Serebrennikov     //   cxx11-17-note@#cwg647-f {{overridden virtual function is here}}
583d358b2deSVlad Serebrennikov   };
584d358b2deSVlad Serebrennikov 
585d358b2deSVlad Serebrennikov   struct NonLiteral { NonLiteral() {} }; // #cwg647-NonLiteral
586d358b2deSVlad Serebrennikov 
587d358b2deSVlad Serebrennikov   struct C {
588d358b2deSVlad Serebrennikov     constexpr C(NonLiteral);
589d358b2deSVlad Serebrennikov     constexpr C(NonLiteral, int) {}
590d358b2deSVlad Serebrennikov     // cxx11-20-error@-1 {{constexpr constructor's 1st parameter type 'NonLiteral' is not a literal type}}
591d358b2deSVlad Serebrennikov     //   cxx11-20-note@#cwg647-NonLiteral {{'NonLiteral' is not literal because it is not an aggregate and has no constexpr constructors other than copy or move constructors}}
592d358b2deSVlad Serebrennikov     constexpr C() try {} catch (...) {}
593d358b2deSVlad Serebrennikov     // cxx11-17-error@-1 {{function try block in constexpr constructor is a C++20 extension}}
594d358b2deSVlad Serebrennikov     // cxx11-error@-2 {{use of this statement in a constexpr constructor is a C++14 extension}}
595d358b2deSVlad Serebrennikov   };
596d358b2deSVlad Serebrennikov 
597d358b2deSVlad Serebrennikov   struct D {
598d358b2deSVlad Serebrennikov     operator int() const;
599d358b2deSVlad Serebrennikov     constexpr D(int) {}
600d358b2deSVlad Serebrennikov     D(float); // #cwg647-D-float-ctor
601d358b2deSVlad Serebrennikov   };
602d358b2deSVlad Serebrennikov   constexpr int get();
603d358b2deSVlad Serebrennikov   struct E {
604d358b2deSVlad Serebrennikov     int n;
605d358b2deSVlad Serebrennikov     D d;
606d358b2deSVlad Serebrennikov 
607d358b2deSVlad Serebrennikov     // FIXME: We should diagnose this, as the conversion function is not
608d358b2deSVlad Serebrennikov     // constexpr. However, that part of this issue is supreseded by cwg1364 and
609d358b2deSVlad Serebrennikov     // others; no diagnostic is required for this any more.
610d358b2deSVlad Serebrennikov     constexpr E()
611d358b2deSVlad Serebrennikov         : n(D(0)),
612d358b2deSVlad Serebrennikov           d(0) {}
613d358b2deSVlad Serebrennikov 
614d358b2deSVlad Serebrennikov     constexpr E(int)
615d358b2deSVlad Serebrennikov     // cxx11-20-error@-1 {{constexpr constructor never produces a constant expression}}
616d358b2deSVlad Serebrennikov     //   cxx11-20-note@#cwg647-int-d {{non-constexpr constructor 'D' cannot be used in a constant expression}}
617d358b2deSVlad Serebrennikov     //   cxx11-20-note@#cwg647-D-float-ctor {{declared here}}
618d358b2deSVlad Serebrennikov         : n(0),
619d358b2deSVlad Serebrennikov           d(0.0f) {} // #cwg647-int-d
620d358b2deSVlad Serebrennikov     constexpr E(float f)
621d358b2deSVlad Serebrennikov     // cxx11-20-error@-1 {{never produces a constant expression}}
622d358b2deSVlad Serebrennikov     //   cxx11-20-note@#cwg647-float-d {{non-constexpr constructor}}
623d358b2deSVlad Serebrennikov     //   cxx11-20-note@#cwg647-D-float-ctor {{declared here}}
624d358b2deSVlad Serebrennikov         : n(get()),
625d358b2deSVlad Serebrennikov           d(D(0) + f) {} // #cwg647-float-d
626d358b2deSVlad Serebrennikov   };
627d358b2deSVlad Serebrennikov #endif
628463e61a0SVlad Serebrennikov } // namespace cwg647
629d358b2deSVlad Serebrennikov 
630*14ba3f9dSVlad Serebrennikov namespace cwg648 { // cwg648: 2.7
631463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
632d358b2deSVlad Serebrennikov   int f();
633d358b2deSVlad Serebrennikov   constexpr int a = (true ? 1 : f());
634d358b2deSVlad Serebrennikov   constexpr int b = false && f();
635d358b2deSVlad Serebrennikov   constexpr int c = true || f();
636d358b2deSVlad Serebrennikov #endif
637463e61a0SVlad Serebrennikov } // namespace cwg648
638d358b2deSVlad Serebrennikov 
639d358b2deSVlad Serebrennikov namespace cwg649 { // cwg649: 3.5
640463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
641d358b2deSVlad Serebrennikov // Maximum alignment is 8192 bytes for Windows, and 4 GB for Linux
642d358b2deSVlad Serebrennikov alignas(0x200000000) int n;
643d358b2deSVlad Serebrennikov // since-cxx11-error-re@-1 {{{{requested alignment must be (8192|4294967296) bytes or smaller}}}}
644d358b2deSVlad Serebrennikov struct alignas(0x200000000) X {};
645d358b2deSVlad Serebrennikov // since-cxx11-error-re@-1 {{{{requested alignment must be (8192|4294967296) bytes or smaller}}}}
646d358b2deSVlad Serebrennikov struct Y {
647d358b2deSVlad Serebrennikov   int n alignas(0x200000000);
648d358b2deSVlad Serebrennikov   // since-cxx11-error-re@-1 {{{{requested alignment must be (8192|4294967296) bytes or smaller}}}}
649d358b2deSVlad Serebrennikov };
650d358b2deSVlad Serebrennikov   struct alignas(256) Z {};
651d358b2deSVlad Serebrennikov   // This part is superseded by cwg2130 and eventually by aligned allocation support.
652d358b2deSVlad Serebrennikov   auto *p = new Z;
653d358b2deSVlad Serebrennikov #endif
654463e61a0SVlad Serebrennikov } // namespace cwg649
655d358b2deSVlad Serebrennikov 
656d358b2deSVlad Serebrennikov // cwg650 is in cwg650.cpp
657d358b2deSVlad Serebrennikov 
658*14ba3f9dSVlad Serebrennikov namespace cwg651 { // cwg651: 2.7
659463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
660d358b2deSVlad Serebrennikov   struct X {
661d358b2deSVlad Serebrennikov     virtual X &f();
662d358b2deSVlad Serebrennikov   };
663d358b2deSVlad Serebrennikov   struct Y : X {
664d358b2deSVlad Serebrennikov     Y &f();
665d358b2deSVlad Serebrennikov   };
666d358b2deSVlad Serebrennikov   using T = decltype(((X&&)Y()).f());
667d358b2deSVlad Serebrennikov   using T = X &;
668d358b2deSVlad Serebrennikov #endif
669463e61a0SVlad Serebrennikov } // namespace cwg651
670d358b2deSVlad Serebrennikov 
671*14ba3f9dSVlad Serebrennikov namespace cwg652 { // cwg652: 3.1
672463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
673d358b2deSVlad Serebrennikov   constexpr int n = 1.2 * 3.4;
674d358b2deSVlad Serebrennikov   static_assert(n == 4, "");
675d358b2deSVlad Serebrennikov #endif
676463e61a0SVlad Serebrennikov } // namespace cwg652
677d358b2deSVlad Serebrennikov 
678d358b2deSVlad Serebrennikov // cwg653 is in cwg653.cpp
679d358b2deSVlad Serebrennikov 
680d358b2deSVlad Serebrennikov namespace cwg654 { // cwg654: sup 1423
681463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
682d358b2deSVlad Serebrennikov   void f() {
683d358b2deSVlad Serebrennikov     if (nullptr) {}
684d358b2deSVlad Serebrennikov     // since-cxx11-warning@-1 {{implicit conversion of nullptr constant to 'bool'}}
685d358b2deSVlad Serebrennikov     bool b = nullptr;
686d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{cannot initialize a variable of type 'bool' with an rvalue of type 'std::nullptr_t'}}
687d358b2deSVlad Serebrennikov     if (nullptr == 0) {}
688d358b2deSVlad Serebrennikov     if (nullptr != 0) {}
689d358b2deSVlad Serebrennikov     if (nullptr <= 0) {}
690d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{invalid operands to binary expression ('std::nullptr_t' and 'int')}}
691d358b2deSVlad Serebrennikov     if (nullptr == 1) {}
692d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{invalid operands to binary expression ('std::nullptr_t' and 'int')}}
693d358b2deSVlad Serebrennikov     if (!nullptr) {}
694d358b2deSVlad Serebrennikov     // since-cxx11-warning@-1 {{implicit conversion of nullptr constant to 'bool'}}
695d358b2deSVlad Serebrennikov     decltype(nullptr) n = 0;
696d358b2deSVlad Serebrennikov     static_cast<int>(nullptr);
697d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{static_cast from 'std::nullptr_t' to 'int' is not allowed}}
698d358b2deSVlad Serebrennikov     (void)static_cast<decltype(nullptr)>(0);
699d358b2deSVlad Serebrennikov     static_cast<decltype(nullptr)>(1);
700d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{static_cast from 'int' to 'decltype(nullptr)' (aka 'std::nullptr_t') is not allowed}}
701d358b2deSVlad Serebrennikov     void(true ? nullptr : 0);
702d358b2deSVlad Serebrennikov     void(true ? 0 : nullptr);
703d358b2deSVlad Serebrennikov   }
704d358b2deSVlad Serebrennikov #endif
705463e61a0SVlad Serebrennikov } // namespace cwg654
706d358b2deSVlad Serebrennikov 
707*14ba3f9dSVlad Serebrennikov namespace cwg655 { // cwg655: 3.0
708d358b2deSVlad Serebrennikov   struct A { A(int); }; // #cwg655-A
709d358b2deSVlad Serebrennikov   struct B : A {
710d358b2deSVlad Serebrennikov     A a; // #cwg655-a
711d358b2deSVlad Serebrennikov     B();
712d358b2deSVlad Serebrennikov     B(int) : B() {}
713d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{delegating constructors are permitted only in C++11}}
714d358b2deSVlad Serebrennikov     B(int*) : A() {} // #cwg655-delegating-to-A
715d358b2deSVlad Serebrennikov     // expected-error@-1 {{no matching constructor for initialization of 'A'}}
716d358b2deSVlad Serebrennikov     //   expected-note@#cwg655-A {{candidate constructor not viable: requires 1 argument, but 0 were provided}}
717d358b2deSVlad Serebrennikov     //   expected-note@#cwg655-A {{candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided}}
718d358b2deSVlad Serebrennikov     //   since-cxx11-note@#cwg655-A {{candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were provided}}
719d358b2deSVlad Serebrennikov     // expected-error@#cwg655-delegating-to-A {{constructor for 'cwg655::B' must explicitly initialize the member 'a' which does not have a default constructor}}
720d358b2deSVlad Serebrennikov     //   expected-note@#cwg655-a {{member is declared here}}
721d358b2deSVlad Serebrennikov     //   expected-note@#cwg655-A {{'cwg655::A' declared here}}
722d358b2deSVlad Serebrennikov   };
723463e61a0SVlad Serebrennikov } // namespace cwg655
724d358b2deSVlad Serebrennikov 
725*14ba3f9dSVlad Serebrennikov namespace cwg656 { // cwg656: 2.8
726d358b2deSVlad Serebrennikov   struct A { A(const A&) = delete; };
727d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
728d358b2deSVlad Serebrennikov   struct B : A {};
729d358b2deSVlad Serebrennikov   struct X { operator B(); } x;
730d358b2deSVlad Serebrennikov   const A &r = x;
731d358b2deSVlad Serebrennikov   struct Y : private A { // #cwg656-Y
732d358b2deSVlad Serebrennikov     operator B() volatile;
733d358b2deSVlad Serebrennikov   };
734d358b2deSVlad Serebrennikov   extern Y y;
735d358b2deSVlad Serebrennikov   extern volatile Y vy;
736d358b2deSVlad Serebrennikov   // Conversion not considered due to reference-related types.
737d358b2deSVlad Serebrennikov   const A &s = y;
738d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot cast 'const Y' to its private base class 'const A'}}
739d358b2deSVlad Serebrennikov   //   expected-note@#cwg656-Y {{declared private here}}
740d358b2deSVlad Serebrennikov   const A &t = vy;
741d358b2deSVlad Serebrennikov   // expected-error@-1 {{binding reference of type 'const A' to value of type 'volatile Y' drops 'volatile' qualifier}}
742d358b2deSVlad Serebrennikov 
743d358b2deSVlad Serebrennikov   struct C { operator struct D(); } c;
744d358b2deSVlad Serebrennikov   struct D : C {};
745d358b2deSVlad Serebrennikov   const D &d = c; // ok, D not reference-related to C
746d358b2deSVlad Serebrennikov 
747d358b2deSVlad Serebrennikov   template<typename T> void accept(T); // #cwg656-accept-T
748d358b2deSVlad Serebrennikov   template<typename T> void accept(...) = delete; // #cwg656-accept-var
749d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
750d358b2deSVlad Serebrennikov   void f() {
751d358b2deSVlad Serebrennikov     accept<const A&>(x);
752d358b2deSVlad Serebrennikov     accept<const A&>(y);
753d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot cast 'const Y' to its private base class 'const cwg656::A'}}
754d358b2deSVlad Serebrennikov     //   expected-note@#cwg656-Y {{declared private here}}
755d358b2deSVlad Serebrennikov     accept<const A&>(vy); // #cwg656-vy
756d358b2deSVlad Serebrennikov     // expected-error@-1 {{call to deleted function 'accept'}}
757d358b2deSVlad Serebrennikov     //   expected-note@#cwg656-accept-var {{candidate function [with T = const cwg656::A &] has been explicitly deleted}}
758d358b2deSVlad Serebrennikov     //   expected-note@#cwg656-accept-T {{candidate function template not viable: no known conversion from 'volatile Y' to 'const A &' for 1st argument}}
759d358b2deSVlad Serebrennikov     // expected-error@#cwg656-vy {{no matching constructor for initialization of 'volatile Y'}}
760d358b2deSVlad Serebrennikov     //   expected-note@#cwg656-Y {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('volatile Y') would lose volatile qualifier}}
761d358b2deSVlad Serebrennikov     //   expected-note@#cwg656-Y {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
762d358b2deSVlad Serebrennikov     accept<const D&>(c);
763d358b2deSVlad Serebrennikov   }
764463e61a0SVlad Serebrennikov } // namespace cwg656
765d358b2deSVlad Serebrennikov 
766d358b2deSVlad Serebrennikov namespace cwg657 { // cwg657: partial
767d358b2deSVlad Serebrennikov   struct Abs { virtual void x() = 0; }; // #cwg657-Abs
768d358b2deSVlad Serebrennikov   struct Der : public Abs { virtual void x(); };
769d358b2deSVlad Serebrennikov 
770d358b2deSVlad Serebrennikov   struct Cnvt { template<typename F> Cnvt(F); };
771d358b2deSVlad Serebrennikov 
772d358b2deSVlad Serebrennikov   void foo(Cnvt a);
773d358b2deSVlad Serebrennikov   void foo(Abs &a);
774d358b2deSVlad Serebrennikov   void f(Abs *a) { foo(*a); }
775d358b2deSVlad Serebrennikov 
776d358b2deSVlad Serebrennikov   void bar(Abs &a);
777d358b2deSVlad Serebrennikov   template<typename T> void bar(T);
778d358b2deSVlad Serebrennikov   void g(Abs *a) { bar(*a); }
779d358b2deSVlad Serebrennikov 
780d358b2deSVlad Serebrennikov   // FIXME: The following examples demonstrate that we might be accepting the
781d358b2deSVlad Serebrennikov   // above cases for the wrong reason.
782d358b2deSVlad Serebrennikov 
783d358b2deSVlad Serebrennikov   struct C { C(Abs) {} };
784d358b2deSVlad Serebrennikov   // expected-error@-1 {{parameter type 'Abs' is an abstract class}}
785d358b2deSVlad Serebrennikov   //   expected-note@#cwg657-Abs {{unimplemented pure virtual method 'x' in 'Abs'}}
786d358b2deSVlad Serebrennikov   struct Q { operator Abs() { __builtin_unreachable(); } } q;
787d358b2deSVlad Serebrennikov   // expected-error@-1 {{return type 'Abs' is an abstract class}}
788d358b2deSVlad Serebrennikov #if __cplusplus >= 201703L
789d358b2deSVlad Serebrennikov   // FIXME: We should *definitely* reject this.
790d358b2deSVlad Serebrennikov   C c = Q().operator Abs();
791d358b2deSVlad Serebrennikov #endif
792d358b2deSVlad Serebrennikov 
793d358b2deSVlad Serebrennikov   template<typename F> struct Cnvt2 { Cnvt2(F); typedef int type; };
794d358b2deSVlad Serebrennikov 
795d358b2deSVlad Serebrennikov   // FIXME: We should reject this.
796d358b2deSVlad Serebrennikov   void baz(Abs &a);
797d358b2deSVlad Serebrennikov   template<typename T> typename Cnvt2<T>::type baz(T);
798d358b2deSVlad Serebrennikov   void h(Abs *a) { baz(*a); }
799d358b2deSVlad Serebrennikov 
800d358b2deSVlad Serebrennikov   // FIXME: We should reject this too.
801d358b2deSVlad Serebrennikov   Cnvt2<Abs>::type err;
802463e61a0SVlad Serebrennikov } // namespace cwg657
803d358b2deSVlad Serebrennikov 
804d358b2deSVlad Serebrennikov // cwg658 is in cwg658.cpp
805d358b2deSVlad Serebrennikov 
806d358b2deSVlad Serebrennikov namespace cwg659 { // cwg659: 3.0
807463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
808d358b2deSVlad Serebrennikov   static_assert(alignof(char) == alignof(char&), "");
809d358b2deSVlad Serebrennikov   static_assert(alignof(int) == alignof(int&), "");
810d358b2deSVlad Serebrennikov   int n = alignof(int(&)());
811d358b2deSVlad Serebrennikov   // since-cxx11-error@-1 {{invalid application of 'alignof' to a function type}}
812d358b2deSVlad Serebrennikov   struct A; // #cwg659-A
813d358b2deSVlad Serebrennikov   int m = alignof(A&);
814d358b2deSVlad Serebrennikov   // since-cxx11-error@-1 {{invalid application of 'alignof' to an incomplete type 'A'}}
815d358b2deSVlad Serebrennikov   //   since-cxx11-note@#cwg659-A {{forward declaration of 'cwg659::A'}}
816d358b2deSVlad Serebrennikov #endif
817463e61a0SVlad Serebrennikov } // namespace cwg659
818d358b2deSVlad Serebrennikov 
819d358b2deSVlad Serebrennikov namespace cwg660 { // cwg660: 3.0
820463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
821d358b2deSVlad Serebrennikov   enum : int { a };
822d358b2deSVlad Serebrennikov   enum class { b };
823d358b2deSVlad Serebrennikov   // since-cxx11-error@-1 {{scoped enumeration requires a name}}
824d358b2deSVlad Serebrennikov   auto x = a;
825d358b2deSVlad Serebrennikov 
826d358b2deSVlad Serebrennikov   struct X {
827d358b2deSVlad Serebrennikov     enum : int { a };
828d358b2deSVlad Serebrennikov     enum class { b };
829d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{scoped enumeration requires a name}}
830d358b2deSVlad Serebrennikov   };
831d358b2deSVlad Serebrennikov   auto y = X::a;
832d358b2deSVlad Serebrennikov #endif
833463e61a0SVlad Serebrennikov } // namespace cwg660
834d358b2deSVlad Serebrennikov 
835d358b2deSVlad Serebrennikov // cwg661 is in cwg661.cpp
836d358b2deSVlad Serebrennikov 
837*14ba3f9dSVlad Serebrennikov namespace cwg662 { // cwg662: 2.7
838d358b2deSVlad Serebrennikov   template <typename T> void f(T t) {
839d358b2deSVlad Serebrennikov     T &tr = t;
840d358b2deSVlad Serebrennikov     T *tp = &t;
841d358b2deSVlad Serebrennikov     // expected-error@-1 {{'tp' declared as a pointer to a reference of type 'int &'}}
842d358b2deSVlad Serebrennikov     //   expected-note@#cwg662-f-call {{in instantiation of function template specialization 'cwg662::f<int &>' requested here}}
843d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
844d358b2deSVlad Serebrennikov     auto *ap = &t;
845d358b2deSVlad Serebrennikov #endif
846d358b2deSVlad Serebrennikov   }
847d358b2deSVlad Serebrennikov   void g(int n) { f<int&>(n); } // #cwg662-f-call
848463e61a0SVlad Serebrennikov } // namespace cwg662
849d358b2deSVlad Serebrennikov 
850d358b2deSVlad Serebrennikov namespace cwg663 { // cwg663: sup P1949
851d358b2deSVlad Serebrennikov   int ЍЎ = 123;
852463e61a0SVlad Serebrennikov } // namespace cwg663
853d358b2deSVlad Serebrennikov 
854*14ba3f9dSVlad Serebrennikov namespace cwg664 { // cwg664: 2.7
855463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
856d358b2deSVlad Serebrennikov   struct A { A(const A&) = delete; };
857d358b2deSVlad Serebrennikov   A &&f(A &&a, int n) {
858d358b2deSVlad Serebrennikov     if (n)
859d358b2deSVlad Serebrennikov       return f(static_cast<A&&>(a), n - 1);
860d358b2deSVlad Serebrennikov     return static_cast<A&&>(a);
861d358b2deSVlad Serebrennikov   }
862d358b2deSVlad Serebrennikov #endif
863463e61a0SVlad Serebrennikov } // namespace cwg664
864d358b2deSVlad Serebrennikov 
865d358b2deSVlad Serebrennikov namespace cwg665 { // cwg665: 2.8
866d358b2deSVlad Serebrennikov   struct A { virtual ~A(); };
867d358b2deSVlad Serebrennikov   struct B : A {} *b;
868d358b2deSVlad Serebrennikov   struct C : private A {} *c; // #cwg665-C
869d358b2deSVlad Serebrennikov   struct D : B, C {} *d;
870d358b2deSVlad Serebrennikov 
871d358b2deSVlad Serebrennikov   struct VB : virtual A {} *vb;
872d358b2deSVlad Serebrennikov   struct VC : private virtual A {} *vc; // #cwg665-VC
873d358b2deSVlad Serebrennikov   struct VD : VB, VC {} *vd;
874d358b2deSVlad Serebrennikov 
875d358b2deSVlad Serebrennikov   void f() {
876d358b2deSVlad Serebrennikov     (void)dynamic_cast<A*>(b);
877d358b2deSVlad Serebrennikov     (void)dynamic_cast<A*>(c);
878d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot cast 'cwg665::C' to its private base class 'cwg665::A'}}
879d358b2deSVlad Serebrennikov     //   expected-note@#cwg665-C {{declared private here}}
880d358b2deSVlad Serebrennikov     (void)dynamic_cast<A*>(d);
881d358b2deSVlad Serebrennikov     /* expected-error@-1 {{ambiguous conversion from derived class 'cwg665::D' to base class 'cwg665::A':
882d358b2deSVlad Serebrennikov     struct cwg665::D -> B -> A
883d358b2deSVlad Serebrennikov     struct cwg665::D -> C -> A}} */
884d358b2deSVlad Serebrennikov     (void)dynamic_cast<A*>(vb);
885d358b2deSVlad Serebrennikov     (void)dynamic_cast<A*>(vc); // emitting diagnostic, even though it could be valid at runtime
886d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot cast 'cwg665::VC' to its private base class 'cwg665::A'}}
887d358b2deSVlad Serebrennikov     //   expected-note@#cwg665-VC {{declared private here}}
888d358b2deSVlad Serebrennikov     (void)dynamic_cast<A*>(vd);
889d358b2deSVlad Serebrennikov   }
890463e61a0SVlad Serebrennikov } // namespace cwg665
891d358b2deSVlad Serebrennikov 
892d358b2deSVlad Serebrennikov namespace cwg666 { // cwg666: 2.8
893d358b2deSVlad Serebrennikov   struct P { friend P operator*(P, P); P(int); } p(0);
894d358b2deSVlad Serebrennikov 
895d358b2deSVlad Serebrennikov   template<int> int f();
896d358b2deSVlad Serebrennikov   template<typename T> int f() {
897d358b2deSVlad Serebrennikov     T::type *p = 0;
898d358b2deSVlad Serebrennikov     // expected-error@-1 {{missing 'typename' prior to dependent type name 'Y::type'}}
899d358b2deSVlad Serebrennikov     //   expected-note@#cwg666-f-Y {{in instantiation of function template specialization 'cwg666::f<cwg666::Y>' requested here}}
900d358b2deSVlad Serebrennikov     int a(T::type);
901d358b2deSVlad Serebrennikov     // expected-error@-1 {{missing 'typename' prior to dependent type name 'Y::type'}}
902d358b2deSVlad Serebrennikov     return f<T::type>();
903d358b2deSVlad Serebrennikov     // expected-error@-1 {{missing 'typename' prior to dependent type name 'Y::type'}}
904d358b2deSVlad Serebrennikov   }
905d358b2deSVlad Serebrennikov   struct X { static const int type = 0; };
906d358b2deSVlad Serebrennikov   struct Y { typedef int type; };
907d358b2deSVlad Serebrennikov   int a = f<X>();
908d358b2deSVlad Serebrennikov   int b = f<Y>(); // #cwg666-f-Y
909463e61a0SVlad Serebrennikov } // namespace cwg666
910d358b2deSVlad Serebrennikov 
911d358b2deSVlad Serebrennikov // Triviality is entirely different in C++98.
912d358b2deSVlad Serebrennikov namespace cwg667 { // cwg667: 8
913463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
914d358b2deSVlad Serebrennikov   struct A {
915d358b2deSVlad Serebrennikov     A() = default; // #cwg667-A-ctor
916d358b2deSVlad Serebrennikov     // since-cxx11-warning@-1 {{explicitly defaulted default constructor is implicitly deleted}}
917d358b2deSVlad Serebrennikov     //   since-cxx11-note@#cwg667-r {{default constructor of 'A' is implicitly deleted because field 'r' of reference type 'int &' would not be initialized}}
918d358b2deSVlad Serebrennikov     //   since-cxx11-note@#cwg667-A-ctor {{replace 'default' with 'delete'}}
919d358b2deSVlad Serebrennikov     int &r; // #cwg667-r
920d358b2deSVlad Serebrennikov   };
921d358b2deSVlad Serebrennikov   static_assert(!__is_trivially_constructible(A), "");
922d358b2deSVlad Serebrennikov 
923d358b2deSVlad Serebrennikov   struct B { ~B() = delete; };
924d358b2deSVlad Serebrennikov   union C { B b; };
925d358b2deSVlad Serebrennikov   static_assert(!__is_trivially_destructible(C), "");
926d358b2deSVlad Serebrennikov 
927d358b2deSVlad Serebrennikov   struct D { D(const D&) = delete; };
928d358b2deSVlad Serebrennikov   struct E : D {};
929d358b2deSVlad Serebrennikov   static_assert(!__is_trivially_constructible(E, const E&), "");
930d358b2deSVlad Serebrennikov 
931d358b2deSVlad Serebrennikov   struct F { F &operator=(F&&) = delete; };
932d358b2deSVlad Serebrennikov   struct G : F {};
933d358b2deSVlad Serebrennikov   static_assert(!__is_trivially_assignable(G, G&&), "");
934d358b2deSVlad Serebrennikov #endif
935463e61a0SVlad Serebrennikov } // namespace cwg667
936d358b2deSVlad Serebrennikov 
937d358b2deSVlad Serebrennikov // cwg668 needs an libc++abi test
938d358b2deSVlad Serebrennikov 
939*14ba3f9dSVlad Serebrennikov namespace cwg669 { // cwg669: 3.1
940463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
941d358b2deSVlad Serebrennikov   void f() {
942d358b2deSVlad Serebrennikov     int n;
943d358b2deSVlad Serebrennikov     using T = decltype(n);
944d358b2deSVlad Serebrennikov     using T = int;
945d358b2deSVlad Serebrennikov     using U = decltype((n));
946d358b2deSVlad Serebrennikov     using U = int &;
947d358b2deSVlad Serebrennikov 
948d358b2deSVlad Serebrennikov     [=] {
949d358b2deSVlad Serebrennikov       using V = decltype(n);
950d358b2deSVlad Serebrennikov       using V = int;
951d358b2deSVlad Serebrennikov       using W = decltype((n));
952d358b2deSVlad Serebrennikov       using W = const int&;
953d358b2deSVlad Serebrennikov     } ();
954d358b2deSVlad Serebrennikov 
955d358b2deSVlad Serebrennikov     struct X {
956d358b2deSVlad Serebrennikov       int n;
957d358b2deSVlad Serebrennikov       void f() const {
958d358b2deSVlad Serebrennikov         using X = decltype(n);
959d358b2deSVlad Serebrennikov         using X = int;
960d358b2deSVlad Serebrennikov         using Y = decltype((n));
961d358b2deSVlad Serebrennikov         using Y = const int&;
962d358b2deSVlad Serebrennikov       }
963d358b2deSVlad Serebrennikov     };
964d358b2deSVlad Serebrennikov   }
965d358b2deSVlad Serebrennikov #endif
966463e61a0SVlad Serebrennikov } // namespace cwg669
967d358b2deSVlad Serebrennikov 
968d358b2deSVlad Serebrennikov namespace cwg671 { // cwg671: 2.9
969d358b2deSVlad Serebrennikov   enum class E { e };
970d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{scoped enumerations are a C++11 extension}}
971d358b2deSVlad Serebrennikov   E e = static_cast<E>(0);
972d358b2deSVlad Serebrennikov   int n = static_cast<int>(E::e);
973d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{use of enumeration in a nested name specifier is a C++11 extension}}
974d358b2deSVlad Serebrennikov   int m = static_cast<int>(e);
975463e61a0SVlad Serebrennikov } // namespace cwg671
976d358b2deSVlad Serebrennikov 
977d358b2deSVlad Serebrennikov // cwg672 is in cwg672.cpp
978d358b2deSVlad Serebrennikov 
979*14ba3f9dSVlad Serebrennikov namespace cwg673 { // cwg673: 2.7
980d358b2deSVlad Serebrennikov   template<typename> struct X { static const int n = 0; };
981d358b2deSVlad Serebrennikov 
982d358b2deSVlad Serebrennikov   class A {
983d358b2deSVlad Serebrennikov     friend class B *f();
984d358b2deSVlad Serebrennikov     class C *f();
985d358b2deSVlad Serebrennikov     void f(class D *);
986d358b2deSVlad Serebrennikov     enum { e = X<struct E>::n };
9873c5f2698SVlad Serebrennikov     void g() { extern struct FF *p; }
988d358b2deSVlad Serebrennikov   };
989d358b2deSVlad Serebrennikov   B *b;
990d358b2deSVlad Serebrennikov   C *c;
991d358b2deSVlad Serebrennikov   D *d;
992d358b2deSVlad Serebrennikov   E *e;
9933c5f2698SVlad Serebrennikov   FF *ff;
9943c5f2698SVlad Serebrennikov   // expected-error@-1 {{unknown type name 'FF'}}
995463e61a0SVlad Serebrennikov } // namespace cwg673
996d358b2deSVlad Serebrennikov 
997d358b2deSVlad Serebrennikov namespace cwg674 { // cwg674: 8
998d358b2deSVlad Serebrennikov   template<typename T> int f(T);
999d358b2deSVlad Serebrennikov 
1000d358b2deSVlad Serebrennikov   int g(int);
1001d358b2deSVlad Serebrennikov   template<typename T> int g(T);
1002d358b2deSVlad Serebrennikov 
1003d358b2deSVlad Serebrennikov   int h(int);
1004d358b2deSVlad Serebrennikov   template<typename T> int h(T);
1005d358b2deSVlad Serebrennikov 
1006d358b2deSVlad Serebrennikov   class X {
1007d358b2deSVlad Serebrennikov     friend int cwg674::f(int);
1008d358b2deSVlad Serebrennikov     friend int cwg674::g(int);
1009d358b2deSVlad Serebrennikov     friend int cwg674::h<>(int);
1010d358b2deSVlad Serebrennikov     int n; // #cwg674-X-n
1011d358b2deSVlad Serebrennikov   };
1012d358b2deSVlad Serebrennikov 
1013d358b2deSVlad Serebrennikov   template<typename T> int f(T) { return X().n; }
1014d358b2deSVlad Serebrennikov   int g(int) { return X().n; }
1015d358b2deSVlad Serebrennikov   template<typename T> int g(T) { return X().n; }
1016d358b2deSVlad Serebrennikov   // expected-error@-1 {{'n' is a private member of 'cwg674::X'}}
1017d358b2deSVlad Serebrennikov   //   expected-note@#cwg674-g-int {{in instantiation of function template specialization 'cwg674::g<int>' requested here}}
1018d358b2deSVlad Serebrennikov   //   expected-note@#cwg674-X-n {{implicitly declared private here}}
1019d358b2deSVlad Serebrennikov   int h(int) { return X().n; }
1020d358b2deSVlad Serebrennikov   // expected-error@-1 {{'n' is a private member of 'cwg674::X'}}
1021d358b2deSVlad Serebrennikov   //   expected-note@#cwg674-X-n {{implicitly declared private here}}
1022d358b2deSVlad Serebrennikov   template<typename T> int h(T) { return X().n; }
1023d358b2deSVlad Serebrennikov 
1024d358b2deSVlad Serebrennikov   template int f(int);
1025d358b2deSVlad Serebrennikov   template int g(int); // #cwg674-g-int
1026d358b2deSVlad Serebrennikov   template int h(int);
1027d358b2deSVlad Serebrennikov 
1028d358b2deSVlad Serebrennikov 
1029d358b2deSVlad Serebrennikov   struct Y {
1030d358b2deSVlad Serebrennikov     template<typename T> int f(T);
1031d358b2deSVlad Serebrennikov 
1032d358b2deSVlad Serebrennikov     int g(int);
1033d358b2deSVlad Serebrennikov     template<typename T> int g(T);
1034d358b2deSVlad Serebrennikov 
1035d358b2deSVlad Serebrennikov     int h(int);
1036d358b2deSVlad Serebrennikov     template<typename T> int h(T);
1037d358b2deSVlad Serebrennikov   };
1038d358b2deSVlad Serebrennikov 
1039d358b2deSVlad Serebrennikov   class Z {
1040d358b2deSVlad Serebrennikov     friend int Y::f(int);
1041d358b2deSVlad Serebrennikov     friend int Y::g(int);
1042d358b2deSVlad Serebrennikov     friend int Y::h<>(int);
1043d358b2deSVlad Serebrennikov     int n; // #cwg674-Z-n
1044d358b2deSVlad Serebrennikov   };
1045d358b2deSVlad Serebrennikov 
1046d358b2deSVlad Serebrennikov   template<typename T> int Y::f(T) { return Z().n; }
1047d358b2deSVlad Serebrennikov   int Y::g(int) { return Z().n; }
1048d358b2deSVlad Serebrennikov   template<typename T> int Y::g(T) { return Z().n; }
1049d358b2deSVlad Serebrennikov   // expected-error@-1 {{'n' is a private member of 'cwg674::Z'}}
1050d358b2deSVlad Serebrennikov   //   expected-note@#cwg674-Y-g-int {{in instantiation of function template specialization 'cwg674::Y::g<int>' requested here}}
1051d358b2deSVlad Serebrennikov   //   expected-note@#cwg674-Z-n {{implicitly declared private here}}
1052d358b2deSVlad Serebrennikov   int Y::h(int) { return Z().n; }
1053d358b2deSVlad Serebrennikov   // expected-error@-1 {{'n' is a private member of 'cwg674::Z'}}
1054d358b2deSVlad Serebrennikov   //   expected-note@#cwg674-Z-n {{implicitly declared private here}}
1055d358b2deSVlad Serebrennikov   template<typename T> int Y::h(T) { return Z().n; }
1056d358b2deSVlad Serebrennikov 
1057d358b2deSVlad Serebrennikov   // FIXME: Should the <> be required here?
1058d358b2deSVlad Serebrennikov   template int Y::f<>(int);
1059d358b2deSVlad Serebrennikov   template int Y::g<>(int); // #cwg674-Y-g-int
1060d358b2deSVlad Serebrennikov   template int Y::h<>(int);
1061463e61a0SVlad Serebrennikov } // namespace cwg674
1062d358b2deSVlad Serebrennikov 
1063d358b2deSVlad Serebrennikov namespace cwg675 { // cwg675: dup 739
1064d358b2deSVlad Serebrennikov   template<typename T> struct A { T n : 1; };
1065d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
1066d358b2deSVlad Serebrennikov   static_assert(A<char>{1}.n < 0, "");
1067d358b2deSVlad Serebrennikov   // since-cxx11-warning@-1 {{implicit truncation from 'int' to a one-bit wide bit-field changes value from 1 to -1}}
1068d358b2deSVlad Serebrennikov   static_assert(A<int>{1}.n < 0, "");
1069d358b2deSVlad Serebrennikov   // since-cxx11-warning@-1 {{implicit truncation from 'int' to a one-bit wide bit-field changes value from 1 to -1}}
1070d358b2deSVlad Serebrennikov   static_assert(A<long long>{1}.n < 0, "");
1071d358b2deSVlad Serebrennikov   // since-cxx11-warning@-1 {{implicit truncation from 'int' to a one-bit wide bit-field changes value from 1 to -1}}
1072d358b2deSVlad Serebrennikov #endif
1073463e61a0SVlad Serebrennikov } // namespace cwg675
1074d358b2deSVlad Serebrennikov 
1075d358b2deSVlad Serebrennikov // cwg676: na
1076d358b2deSVlad Serebrennikov 
1077d358b2deSVlad Serebrennikov namespace cwg677 { // cwg677: no
1078d358b2deSVlad Serebrennikov   struct A {
1079d358b2deSVlad Serebrennikov     void *operator new(std::size_t);
1080d358b2deSVlad Serebrennikov     void operator delete(void*) = delete; // #cwg677-A-delete
1081d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
1082d358b2deSVlad Serebrennikov   };
1083d358b2deSVlad Serebrennikov   struct B {
1084d358b2deSVlad Serebrennikov     void *operator new(std::size_t);
1085d358b2deSVlad Serebrennikov     void operator delete(void*) = delete; // #cwg677-B-delete
1086d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
1087d358b2deSVlad Serebrennikov     virtual ~B();
1088d358b2deSVlad Serebrennikov   };
1089d358b2deSVlad Serebrennikov   void f(A *p) { delete p; }
1090d358b2deSVlad Serebrennikov   // expected-error@-1 {{attempt to use a deleted function}}
1091d358b2deSVlad Serebrennikov   //   expected-note@#cwg677-A-delete {{'operator delete' has been explicitly marked deleted here}}
1092d358b2deSVlad Serebrennikov   // FIXME: This appears to be valid; we shouldn't even be looking up the 'operator delete' here.
1093d358b2deSVlad Serebrennikov   void f(B *p) { delete p; }
1094d358b2deSVlad Serebrennikov   // expected-error@-1 {{attempt to use a deleted function}}
1095d358b2deSVlad Serebrennikov   //   expected-note@#cwg677-B-delete {{'operator delete' has been explicitly marked deleted here}}
1096d358b2deSVlad Serebrennikov   B::~B() {}
1097d358b2deSVlad Serebrennikov   // expected-error@-1 {{attempt to use a deleted function}}
1098d358b2deSVlad Serebrennikov   //   expected-note@#cwg677-B-delete {{'operator delete' has been explicitly marked deleted here}}
1099463e61a0SVlad Serebrennikov } // namespace cwg677
1100d358b2deSVlad Serebrennikov 
1101d358b2deSVlad Serebrennikov // cwg678 FIXME: check that the modules ODR check catches this
1102d358b2deSVlad Serebrennikov 
1103*14ba3f9dSVlad Serebrennikov namespace cwg679 { // cwg679: 2.7
1104d358b2deSVlad Serebrennikov   struct X {};
1105d358b2deSVlad Serebrennikov   template<int> void operator+(X, X);
1106d358b2deSVlad Serebrennikov   template<> void operator+<0>(X, X) {} // #cwg679-def
1107d358b2deSVlad Serebrennikov   template<> void operator+<0>(X, X) {}
1108d358b2deSVlad Serebrennikov   // expected-error@-1 {{redefinition of 'operator+<0>'}}
1109d358b2deSVlad Serebrennikov   //   expected-note@#cwg679-def {{previous definition is here}}
1110463e61a0SVlad Serebrennikov } // namespace cwg679
1111d358b2deSVlad Serebrennikov 
1112d358b2deSVlad Serebrennikov // cwg680: na
1113d358b2deSVlad Serebrennikov 
1114d358b2deSVlad Serebrennikov namespace cwg681 { // cwg681: partial
1115463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
1116d358b2deSVlad Serebrennikov   auto *a() -> int;
1117d358b2deSVlad Serebrennikov   // since-cxx11-error@-1 {{function with trailing return type must specify return type 'auto', not 'auto *'}}
1118d358b2deSVlad Serebrennikov   auto (*b)() -> int;
1119d358b2deSVlad Serebrennikov   // FIXME: The errors here aren't great.
1120d358b2deSVlad Serebrennikov   auto (*c()) -> int;
1121d358b2deSVlad Serebrennikov   // since-cxx11-error@-1 {{expected function body after function declarator}}
1122d358b2deSVlad Serebrennikov   auto ((*d)()) -> int;
1123d358b2deSVlad Serebrennikov   // since-cxx11-error@-1 {{declaration of variable 'd' with deduced type 'auto ((*)())' requires an initializer}}
1124d358b2deSVlad Serebrennikov   // since-cxx11-error@-2 {{expected ';' after top level declarator}}
1125d358b2deSVlad Serebrennikov 
1126d358b2deSVlad Serebrennikov   // FIXME: This is definitely wrong. This should be
1127d358b2deSVlad Serebrennikov   //   "function of () returning pointer to function of () returning int"
1128d358b2deSVlad Serebrennikov   // not a function with a deduced return type.
1129d358b2deSVlad Serebrennikov   auto (*e())() -> int;
1130d358b2deSVlad Serebrennikov   // cxx11-error@-1 {{'auto' return without trailing return type; deduced return types are a C++14 extension}}
1131d358b2deSVlad Serebrennikov 
1132d358b2deSVlad Serebrennikov   auto f() -> int (*)();
1133d358b2deSVlad Serebrennikov   auto g() -> auto (*)() -> int;
1134d358b2deSVlad Serebrennikov #endif
1135463e61a0SVlad Serebrennikov } // namespace cwg681
1136d358b2deSVlad Serebrennikov 
1137*14ba3f9dSVlad Serebrennikov namespace cwg683 { // cwg683: 3.3
1138463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
1139d358b2deSVlad Serebrennikov   struct A {
1140d358b2deSVlad Serebrennikov     A() = default;
1141d358b2deSVlad Serebrennikov     A(const A&) = default;
1142d358b2deSVlad Serebrennikov     A(A&);
1143d358b2deSVlad Serebrennikov   };
1144d358b2deSVlad Serebrennikov   static_assert(__is_trivially_constructible(A, const A&), "");
1145d358b2deSVlad Serebrennikov   static_assert(!__is_trivially_constructible(A, A&), "");
1146d358b2deSVlad Serebrennikov   static_assert(!__is_trivial(A), "");
1147d358b2deSVlad Serebrennikov 
1148d358b2deSVlad Serebrennikov   struct B : A {};
1149d358b2deSVlad Serebrennikov   static_assert(__is_trivially_constructible(B, const B&), "");
1150d358b2deSVlad Serebrennikov   static_assert(__is_trivially_constructible(B, B&), "");
1151d358b2deSVlad Serebrennikov   static_assert(__is_trivial(B), "");
1152d358b2deSVlad Serebrennikov #endif
1153463e61a0SVlad Serebrennikov } // namespace cwg683
1154d358b2deSVlad Serebrennikov 
1155d358b2deSVlad Serebrennikov namespace cwg684 { // cwg684: sup 1454
1156463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L
1157d358b2deSVlad Serebrennikov   void f() {
1158d358b2deSVlad Serebrennikov     int a;  // #cwg684-a
1159d358b2deSVlad Serebrennikov     constexpr int *p = &a;
1160eff12650SVlad Serebrennikov     // since-cxx11-error@-1 {{constexpr variable 'p' must be initialized by a constant expression}}
1161eff12650SVlad Serebrennikov     //   since-cxx11-note@-2 {{pointer to 'a' is not a constant expression}}
1162eff12650SVlad Serebrennikov     //   since-cxx11-note@#cwg684-a {{here}}
1163d358b2deSVlad Serebrennikov   }
1164d358b2deSVlad Serebrennikov #endif
1165463e61a0SVlad Serebrennikov } // namespace cwg684
1166d358b2deSVlad Serebrennikov 
1167*14ba3f9dSVlad Serebrennikov namespace cwg685 { // cwg685: 10
1168d358b2deSVlad Serebrennikov   enum E : long { e };
1169d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{enumeration types with a fixed underlying type are a C++11 extension}}
1170d358b2deSVlad Serebrennikov   void f(int);
1171d358b2deSVlad Serebrennikov   int f(long);
1172d358b2deSVlad Serebrennikov   int a = f(e);
1173d358b2deSVlad Serebrennikov 
1174d358b2deSVlad Serebrennikov   enum G : short { g };
1175d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{enumeration types with a fixed underlying type are a C++11 extension}}
1176d358b2deSVlad Serebrennikov   int h(short);
1177d358b2deSVlad Serebrennikov   void h(long);
1178d358b2deSVlad Serebrennikov   int b = h(g);
1179d358b2deSVlad Serebrennikov 
1180d358b2deSVlad Serebrennikov   int i(int);
1181d358b2deSVlad Serebrennikov   void i(long);
1182d358b2deSVlad Serebrennikov   int c = i(g);
1183d358b2deSVlad Serebrennikov 
1184d358b2deSVlad Serebrennikov   int j(unsigned int); // #cwg685-j-uint
1185d358b2deSVlad Serebrennikov   void j(long); // #cwg685-j-long
1186d358b2deSVlad Serebrennikov   int d = j(g);
1187d358b2deSVlad Serebrennikov   // expected-error@-1 {{call to 'j' is ambiguous}}
1188d358b2deSVlad Serebrennikov   //   expected-note@#cwg685-j-uint {{candidate function}}
1189d358b2deSVlad Serebrennikov   //   expected-note@#cwg685-j-long {{candidate function}}
1190d358b2deSVlad Serebrennikov 
1191d358b2deSVlad Serebrennikov   // Valid per cwg1601
1192d358b2deSVlad Serebrennikov   int k(short);
1193d358b2deSVlad Serebrennikov   void k(int);
1194d358b2deSVlad Serebrennikov   int x = k(g);
1195463e61a0SVlad Serebrennikov } // namespace cwg685
1196d358b2deSVlad Serebrennikov 
1197d358b2deSVlad Serebrennikov namespace cwg686 { // cwg686: 3.0
1198d358b2deSVlad Serebrennikov   void f() {
1199d358b2deSVlad Serebrennikov     (void)dynamic_cast<struct A*>(0);
1200d358b2deSVlad Serebrennikov     // expected-error@-1 {{'A' is an incomplete type}}
1201d358b2deSVlad Serebrennikov     //   expected-note@-2 {{forward declaration of 'A'}}
1202d358b2deSVlad Serebrennikov     (void)dynamic_cast<struct A{}*>(0);
1203d358b2deSVlad Serebrennikov     // expected-error@-1 {{'A' cannot be defined in a type specifier}}
1204d358b2deSVlad Serebrennikov     (void)typeid(struct B*);
1205d358b2deSVlad Serebrennikov     (void)typeid(struct B{}*);
1206d358b2deSVlad Serebrennikov     // expected-error@-1 {{'B' cannot be defined in a type specifier}}
1207d358b2deSVlad Serebrennikov     (void)static_cast<struct C*>(0);
1208d358b2deSVlad Serebrennikov     (void)static_cast<struct C{}*>(0);
1209d358b2deSVlad Serebrennikov     // expected-error@-1 {{'C' cannot be defined in a type specifier}}
1210d358b2deSVlad Serebrennikov     (void)reinterpret_cast<struct D*>(0);
1211d358b2deSVlad Serebrennikov     (void)reinterpret_cast<struct D{}*>(0);
1212d358b2deSVlad Serebrennikov     // expected-error@-1 {{'D' cannot be defined in a type specifier}}
1213d358b2deSVlad Serebrennikov     (void)const_cast<struct E*>(0);
1214d358b2deSVlad Serebrennikov     // expected-error@-1 {{const_cast from 'int' to 'struct E *' is not allowed}}
1215d358b2deSVlad Serebrennikov     (void)const_cast<struct E{}*>(0);
1216d358b2deSVlad Serebrennikov     // expected-error@-1 {{'E' cannot be defined in a type specifier}}
1217d358b2deSVlad Serebrennikov     (void)sizeof(struct F*);
1218d358b2deSVlad Serebrennikov     (void)sizeof(struct F{}*);
1219d358b2deSVlad Serebrennikov     // expected-error@-1 {{'F' cannot be defined in a type specifier}}
1220d358b2deSVlad Serebrennikov     (void)new struct G*; // #cwg686-G
1221d358b2deSVlad Serebrennikov     (void)new struct G{}*; // #cwg686-G-def
1222d358b2deSVlad Serebrennikov     // expected-error@-1 {{allocation of incomplete type 'struct G'}}
1223d358b2deSVlad Serebrennikov     //   expected-note@#cwg686-G {{forward declaration of 'G'}}
1224d358b2deSVlad Serebrennikov     // since-cxx11-error@#cwg686-G-def {{expected expression}}
1225d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
1226d358b2deSVlad Serebrennikov     (void)alignof(struct H*);
1227d358b2deSVlad Serebrennikov     (void)alignof(struct H{}*);
1228d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{'H' cannot be defined in a type specifier}}
1229d358b2deSVlad Serebrennikov #endif
1230d358b2deSVlad Serebrennikov     (void)(struct I*)0;
1231d358b2deSVlad Serebrennikov     (void)(struct I{}*)0;
1232d358b2deSVlad Serebrennikov     // expected-error@-1 {{'I' cannot be defined in a type specifier}}
1233d358b2deSVlad Serebrennikov     if (struct J *p = 0) {}
1234d358b2deSVlad Serebrennikov     if (struct J {} *p = 0) {}
1235d358b2deSVlad Serebrennikov     // expected-error@-1 {{'J' cannot be defined in a condition}}
1236d358b2deSVlad Serebrennikov     for (struct K *p = 0; struct L *q = 0; ) {}
1237d358b2deSVlad Serebrennikov     for (struct K {} *p = 0; struct L {} *q = 0; ) {}
1238d358b2deSVlad Serebrennikov     // expected-error@-1 {{'L' cannot be defined in a condition}}
1239d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
1240d358b2deSVlad Serebrennikov     using M = struct {};
1241d358b2deSVlad Serebrennikov #endif
1242d358b2deSVlad Serebrennikov     struct N {
1243d358b2deSVlad Serebrennikov       operator struct O{}(){};
1244d358b2deSVlad Serebrennikov       // expected-error@-1 {{'N::O' cannot be defined in a type specifier}}
1245d358b2deSVlad Serebrennikov     };
1246d358b2deSVlad Serebrennikov     try {}
1247d358b2deSVlad Serebrennikov     catch (struct P *) {}
1248d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot catch pointer to incomplete type 'struct P'}}
1249d358b2deSVlad Serebrennikov     //   expected-note@-2 {{forward declaration of 'P'}}
1250d358b2deSVlad Serebrennikov     catch (struct P {} *) {}
1251d358b2deSVlad Serebrennikov     // expected-error@-1 {{'P' cannot be defined in a type specifier}}
1252eff12650SVlad Serebrennikov #if __cplusplus <= 201402L
1253d358b2deSVlad Serebrennikov     void g() throw(struct Q);
1254eff12650SVlad Serebrennikov     // cxx98-14-error@-1 {{incomplete type 'struct Q' is not allowed in exception specification}}
1255eff12650SVlad Serebrennikov     //   cxx98-14-note@-2 {{forward declaration of 'Q'}}
1256d358b2deSVlad Serebrennikov     void h() throw(struct Q {});
1257eff12650SVlad Serebrennikov     // cxx98-14-error@-1 {{'Q' cannot be defined in a type specifier}}
1258d358b2deSVlad Serebrennikov #endif
1259d358b2deSVlad Serebrennikov   }
1260d358b2deSVlad Serebrennikov   template<struct R *> struct X;
1261d358b2deSVlad Serebrennikov   template<struct R {} *> struct Y;
1262d358b2deSVlad Serebrennikov   // expected-error@-1 {{'cwg686::R' cannot be defined in a type specifier}}
1263463e61a0SVlad Serebrennikov } // namespace cwg686
1264d358b2deSVlad Serebrennikov 
1265d358b2deSVlad Serebrennikov namespace cwg687 { // cwg687 (9 c++20, but the issue is still considered open)
1266d358b2deSVlad Serebrennikov   template<typename T> void f(T a) {
1267d358b2deSVlad Serebrennikov     // This is valid in C++20.
1268d358b2deSVlad Serebrennikov     g<int>(a);
1269d358b2deSVlad Serebrennikov     // cxx98-17-error@-1 {{use of function template name with no prior declaration in function call with explicit template arguments is a C++20 extension}}
1270d358b2deSVlad Serebrennikov 
1271d358b2deSVlad Serebrennikov     // This is not.
1272d358b2deSVlad Serebrennikov     template g<int>(a);
1273ef7d46c7SBraden Helmer     // expected-error@-1 {{expected '<' after 'template'}}
1274d358b2deSVlad Serebrennikov   }
1275463e61a0SVlad Serebrennikov } // namespace cwg687
1276d358b2deSVlad Serebrennikov 
1277d358b2deSVlad Serebrennikov namespace cwg692 { // cwg692: 16
1278d358b2deSVlad Serebrennikov   // Also see cwg1395.
1279d358b2deSVlad Serebrennikov 
1280d358b2deSVlad Serebrennikov   namespace temp_func_order_example2 {
1281d358b2deSVlad Serebrennikov     template <typename... T> struct A1 {};
1282d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1283d358b2deSVlad Serebrennikov     template <typename U, typename... T> struct A2 {};
1284d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1285d358b2deSVlad Serebrennikov     template <typename T1, typename... U> void e1(A1<T1, U...>) = delete;
1286d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1287d358b2deSVlad Serebrennikov     // cxx98-error@-2 {{deleted function definitions are a C++11 extension}}
1288d358b2deSVlad Serebrennikov     template <typename T1> void e1(A1<T1>);
1289d358b2deSVlad Serebrennikov     template <typename T1, typename... U> void e2(A2<T1, U...>) = delete;
1290d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1291d358b2deSVlad Serebrennikov     // cxx98-error@-2 {{deleted function definitions are a C++11 extension}}
1292d358b2deSVlad Serebrennikov     template <typename T1> void e2(A2<T1>);
1293d358b2deSVlad Serebrennikov     template <typename T, typename U> void f(U, A1<U, T> *p = 0) = delete; // #cwg692-f-deleted
1294d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{deleted function definitions are a C++11 extension}}
1295d358b2deSVlad Serebrennikov     template <typename U> int &f(U, A1<U, U> *p = 0); // #cwg692-f
1296d358b2deSVlad Serebrennikov     template <typename T> void g(T, T = T()); // #cwg692-g
1297d358b2deSVlad Serebrennikov     template <typename T, typename... U> void g(T, U...); // #cwg692-g-variadic
1298d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1299d358b2deSVlad Serebrennikov     void h() {
1300d358b2deSVlad Serebrennikov       A1<int, int> a;
1301d358b2deSVlad Serebrennikov       int &r = f<int>(42, &a);
1302d358b2deSVlad Serebrennikov       A1<int> b1;
1303d358b2deSVlad Serebrennikov       e1(b1);
1304d358b2deSVlad Serebrennikov       A2<int> b2;
1305d358b2deSVlad Serebrennikov       e2(b2);
1306d358b2deSVlad Serebrennikov       f<int>(42);
1307d358b2deSVlad Serebrennikov       // expected-error@-1 {{call to 'f' is ambiguous}}
1308d358b2deSVlad Serebrennikov       //   expected-note@#cwg692-f-deleted {{candidate function [with T = int, U = int] has been explicitly deleted}}
1309d358b2deSVlad Serebrennikov       //   expected-note@#cwg692-f {{candidate function [with U = int]}}
1310d358b2deSVlad Serebrennikov       g(42);
1311d358b2deSVlad Serebrennikov       // expected-error@-1 {{ambiguous}}
1312d358b2deSVlad Serebrennikov       //   expected-note@#cwg692-g {{candidate function [with T = int]}}
1313d358b2deSVlad Serebrennikov       //   expected-note@#cwg692-g-variadic {{candidate function [with T = int, U = <>]}}
1314d358b2deSVlad Serebrennikov     }
1315d358b2deSVlad Serebrennikov   }
1316d358b2deSVlad Serebrennikov 
1317d358b2deSVlad Serebrennikov   namespace temp_func_order_example3 {
1318d358b2deSVlad Serebrennikov     template <typename T, typename... U> void f(T, U...);
1319d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1320d358b2deSVlad Serebrennikov     template <typename T> void f(T);
1321d358b2deSVlad Serebrennikov     template <typename T, typename... U> int &g(T *, U...);
1322d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1323d358b2deSVlad Serebrennikov     template <typename T> void g(T);
1324d358b2deSVlad Serebrennikov     void h(int i) {
1325d358b2deSVlad Serebrennikov       // This is made ambiguous by cwg692, but made valid again by cwg1395.
1326d358b2deSVlad Serebrennikov       f(&i);
1327d358b2deSVlad Serebrennikov       int &r = g(&i);
1328d358b2deSVlad Serebrennikov     }
1329d358b2deSVlad Serebrennikov   }
1330d358b2deSVlad Serebrennikov 
1331d358b2deSVlad Serebrennikov   namespace temp_deduct_partial_example {
1332d358b2deSVlad Serebrennikov     template <typename... Args> char &f(Args... args);
1333d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1334d358b2deSVlad Serebrennikov     template <typename T1, typename... Args> short &f(T1 a1, Args... args);
1335d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1336d358b2deSVlad Serebrennikov     template <typename T1, typename T2> int &f(T1 a1, T2 a2);
1337d358b2deSVlad Serebrennikov     void g() {
1338d358b2deSVlad Serebrennikov       char &a = f();
1339d358b2deSVlad Serebrennikov       short &b = f(1, 2, 3);
1340d358b2deSVlad Serebrennikov       int &c = f(1, 2);
1341d358b2deSVlad Serebrennikov     }
1342d358b2deSVlad Serebrennikov   }
1343d358b2deSVlad Serebrennikov 
1344d358b2deSVlad Serebrennikov   namespace temp_deduct_type_example1 {
1345d358b2deSVlad Serebrennikov     template <class T1, class ...Z> class S;
1346d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1347d358b2deSVlad Serebrennikov     template <class T1, class ...Z> class S<T1, const Z&...>;
1348d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1349d358b2deSVlad Serebrennikov     template <class T1, class T2> class S<T1, const T2&> {};
1350d358b2deSVlad Serebrennikov     S<int, const int&> s;
1351d358b2deSVlad Serebrennikov 
1352d358b2deSVlad Serebrennikov     template<class T, class... U> struct A;
1353d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1354d358b2deSVlad Serebrennikov     template<class T1, class T2, class... U> struct A<T1,T2*,U...> {};
1355d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1356d358b2deSVlad Serebrennikov     template<class T1, class T2> struct A<T1,T2>;
1357d358b2deSVlad Serebrennikov     template struct A<int, int*>;
1358d358b2deSVlad Serebrennikov   }
1359d358b2deSVlad Serebrennikov 
1360d358b2deSVlad Serebrennikov   namespace temp_deduct_type_example3 {
1361d358b2deSVlad Serebrennikov     template<class T, class... U> void f(T*, U...){}
1362d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{variadic templates are a C++11 extension}}
1363d358b2deSVlad Serebrennikov     template<class T> void f(T){}
1364d358b2deSVlad Serebrennikov     template void f(int*);
1365d358b2deSVlad Serebrennikov   }
1366463e61a0SVlad Serebrennikov } // namespace cwg692
1367d358b2deSVlad Serebrennikov 
1368d358b2deSVlad Serebrennikov namespace cwg696 { // cwg696: 3.1
1369d358b2deSVlad Serebrennikov   void f(const int*);
1370d358b2deSVlad Serebrennikov   void g() {
1371d358b2deSVlad Serebrennikov     const int N = 10; // #cwg696-N
1372d358b2deSVlad Serebrennikov     struct A {
1373d358b2deSVlad Serebrennikov       void h() {
1374d358b2deSVlad Serebrennikov         int arr[N]; (void)arr;
1375d358b2deSVlad Serebrennikov         f(&N);
1376d358b2deSVlad Serebrennikov         // expected-error@-1 {{reference to local variable 'N' declared in enclosing function 'cwg696::g'}}
1377d358b2deSVlad Serebrennikov         //   expected-note@#cwg696-N {{'N' declared here}}
1378d358b2deSVlad Serebrennikov       }
1379d358b2deSVlad Serebrennikov     };
1380d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
1381d358b2deSVlad Serebrennikov     (void) [] { int arr[N]; (void)arr; };
1382d358b2deSVlad Serebrennikov     (void)[] { f(&N); };
1383d358b2deSVlad Serebrennikov     // since-cxx11-error@-1 {{variable 'N' cannot be implicitly captured in a lambda with no capture-default specified}}
1384d358b2deSVlad Serebrennikov     //   since-cxx11-note@#cwg696-N {{'N' declared here}}
1385d358b2deSVlad Serebrennikov     //   since-cxx11-note@-3 {{lambda expression begins here}}
1386d358b2deSVlad Serebrennikov     //   since-cxx11-note@-4 {{capture 'N' by value}}
1387d358b2deSVlad Serebrennikov     //   since-cxx11-note@-5 {{capture 'N' by reference}}
1388d358b2deSVlad Serebrennikov     //   since-cxx11-note@-6 {{default capture by value}}
1389d358b2deSVlad Serebrennikov     //   since-cxx11-note@-7 {{default capture by reference}}
1390d358b2deSVlad Serebrennikov #endif
1391d358b2deSVlad Serebrennikov   }
1392463e61a0SVlad Serebrennikov } // namespace cwg696
1393