xref: /llvm-project/clang/test/CXX/drs/cwg1xx.cpp (revision 658ec8593b25f2bd05874deab4582b6759e92e40)
1d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify=expected,cxx98,cxx98-11,cxx98-14,cxx98-17 -fexceptions -fcxx-exceptions -pedantic-errors
2d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,cxx98-11,cxx98-14,cxx98-17,cxx11-14 -fexceptions -fcxx-exceptions -pedantic-errors
3d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,cxx98-14,cxx98-17,cxx11-14 -fexceptions -fcxx-exceptions -pedantic-errors
4d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,since-cxx17,cxx98-17 -fexceptions -fcxx-exceptions -pedantic-errors
5d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors
6d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++23 -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors
7327e2b7cSVlad Serebrennikov // RUN: %clang_cc1 -std=c++2c -triple x86_64-unknown-unknown %s -verify=expected,since-cxx11,since-cxx17 -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 #if __cplusplus == 199711L
15d358b2deSVlad Serebrennikov #define __enable_constant_folding(x) (__builtin_constant_p(x) ? (x) : (x))
16d358b2deSVlad Serebrennikov #else
17d358b2deSVlad Serebrennikov #define __enable_constant_folding
18d358b2deSVlad Serebrennikov #endif
19d358b2deSVlad Serebrennikov 
2014ba3f9dSVlad Serebrennikov namespace cwg100 { // cwg100: 2.7
21d358b2deSVlad Serebrennikov   template<const char (*)[4]> struct A {}; // #cwg100-A
22d358b2deSVlad Serebrennikov   template<const char (&)[4]> struct B {}; // #cwg100-B
23d358b2deSVlad Serebrennikov   template<const char *> struct C {}; // #cwg100-C
24d358b2deSVlad Serebrennikov   template<const char &> struct D {}; // #cwg100-D
25d358b2deSVlad Serebrennikov   A<&"foo"> a; // #cwg100-a
26d358b2deSVlad Serebrennikov   // cxx98-14-error@#cwg100-a {{non-type template argument does not refer to any declaration}}
27d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg100-A {{template parameter is declared here}}
28d358b2deSVlad Serebrennikov   // since-cxx17-error@#cwg100-a {{pointer to string literal is not allowed in a template argument}}
29d358b2deSVlad Serebrennikov   B<"bar"> b; // #cwg100-b
30d358b2deSVlad Serebrennikov   // cxx98-14-error@#cwg100-b {{non-type template argument does not refer to any declaration}}
31d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg100-B {{template parameter is declared here}}
32d358b2deSVlad Serebrennikov   // since-cxx17-error@#cwg100-b {{reference to string literal is not allowed in a template argument}}
33d358b2deSVlad Serebrennikov   C<"baz"> c; // #cwg100-c
34d358b2deSVlad Serebrennikov   // cxx98-14-error@#cwg100-c {{non-type template argument does not refer to any declaration}}
35d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg100-C {{template parameter is declared here}}
36d358b2deSVlad Serebrennikov   // since-cxx17-error@#cwg100-c {{pointer to subobject of string literal is not allowed in a template argument}}
37d358b2deSVlad Serebrennikov   D<*"quux"> d; // #cwg100-d
38d358b2deSVlad Serebrennikov   // cxx98-14-error@#cwg100-d {{non-type template argument does not refer to any declaration}}
39d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg100-D {{template parameter is declared here}}
40d358b2deSVlad Serebrennikov   // since-cxx17-error@#cwg100-d {{reference to subobject of string literal is not allowed in a template argument}}
41463e61a0SVlad Serebrennikov } // namespace cwg100
42d358b2deSVlad Serebrennikov 
43d358b2deSVlad Serebrennikov namespace cwg101 { // cwg101: 3.5
44d358b2deSVlad Serebrennikov   extern "C" void cwg101_f();
45d358b2deSVlad Serebrennikov   typedef unsigned size_t;
46d358b2deSVlad Serebrennikov   namespace X {
47d358b2deSVlad Serebrennikov     extern "C" void cwg101_f();
48d358b2deSVlad Serebrennikov     typedef unsigned size_t;
49d358b2deSVlad Serebrennikov   }
50d358b2deSVlad Serebrennikov   using X::cwg101_f;
51d358b2deSVlad Serebrennikov   using X::size_t;
52d358b2deSVlad Serebrennikov   extern "C" void cwg101_f();
53d358b2deSVlad Serebrennikov   typedef unsigned size_t;
54463e61a0SVlad Serebrennikov } // namespace cwg101
55d358b2deSVlad Serebrennikov 
5614ba3f9dSVlad Serebrennikov namespace cwg102 { // cwg102: 2.7
57d358b2deSVlad Serebrennikov   namespace A {
58d358b2deSVlad Serebrennikov     template<typename T> T f(T a, T b) { return a + b; }
59d358b2deSVlad Serebrennikov     // expected-error@-1 {{call to function 'operator+' that is neither visible in the template definition nor found by argument-dependent lookup}}
60d358b2deSVlad Serebrennikov     //   expected-note@#cwg102-instantiation {{in instantiation of function template specialization 'cwg102::A::f<cwg102::B::S>' requested here}}
61d358b2deSVlad Serebrennikov     //   expected-note@#cwg102-operator-plus {{'operator+' should be declared prior to the call site or in namespace 'cwg102::B'}}
62d358b2deSVlad Serebrennikov   }
63d358b2deSVlad Serebrennikov   namespace B {
64d358b2deSVlad Serebrennikov     struct S {};
65d358b2deSVlad Serebrennikov   }
66d358b2deSVlad Serebrennikov   B::S operator+(B::S, B::S); // #cwg102-operator-plus
67d358b2deSVlad Serebrennikov   template B::S A::f(B::S, B::S); // #cwg102-instantiation
68463e61a0SVlad Serebrennikov } // namespace cwg102
69d358b2deSVlad Serebrennikov 
70d358b2deSVlad Serebrennikov // cwg103: na
71d358b2deSVlad Serebrennikov // cwg104: na lib
72d358b2deSVlad Serebrennikov // cwg105: na
73d358b2deSVlad Serebrennikov 
74d358b2deSVlad Serebrennikov namespace cwg106 { // cwg106: sup 540
75d358b2deSVlad Serebrennikov   typedef int &r1;
76d358b2deSVlad Serebrennikov   typedef r1 &r1;
77d358b2deSVlad Serebrennikov   typedef const r1 r1;
78d358b2deSVlad Serebrennikov   // expected-warning@-1 {{'const' qualifier on reference type 'r1' (aka 'int &') has no effect}}
79d358b2deSVlad Serebrennikov   typedef const r1 &r1;
80d358b2deSVlad Serebrennikov   // expected-warning@-1 {{'const' qualifier on reference type 'r1' (aka 'int &') has no effect}}
81d358b2deSVlad Serebrennikov 
82d358b2deSVlad Serebrennikov   typedef const int &r2;
83d358b2deSVlad Serebrennikov   typedef r2 &r2;
84d358b2deSVlad Serebrennikov   typedef const r2 r2;
85d358b2deSVlad Serebrennikov   // expected-warning@-1 {{'const' qualifier on reference type 'r2' (aka 'const int &') has no effect}}
86d358b2deSVlad Serebrennikov   typedef const r2 &r2;
87d358b2deSVlad Serebrennikov   // expected-warning@-1 {{'const' qualifier on reference type 'r2' (aka 'const int &') has no effect}}
88463e61a0SVlad Serebrennikov } // namespace cwg106
89d358b2deSVlad Serebrennikov 
9014ba3f9dSVlad Serebrennikov namespace cwg107 { // cwg107: 2.7
91d358b2deSVlad Serebrennikov   struct S {};
92d358b2deSVlad Serebrennikov   extern "C" S operator+(S, S) { return S(); }
93463e61a0SVlad Serebrennikov } // namespace cwg107
94d358b2deSVlad Serebrennikov 
95d358b2deSVlad Serebrennikov namespace cwg108 { // cwg108: 2.9
96d358b2deSVlad Serebrennikov   template<typename T> struct A {
97d358b2deSVlad Serebrennikov     struct B { typedef int X; };
98d358b2deSVlad Serebrennikov     B::X x;
99d358b2deSVlad Serebrennikov     // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name B::X; implicit 'typename' is a C++20 extension}}
100d358b2deSVlad Serebrennikov     struct C : B { X x; };
101d358b2deSVlad Serebrennikov     // expected-error@-1 {{unknown type name 'X'}}
102d358b2deSVlad Serebrennikov   };
103d358b2deSVlad Serebrennikov   template<> struct A<int>::B { int X; };
104463e61a0SVlad Serebrennikov } // namespace cwg108
105d358b2deSVlad Serebrennikov 
10614ba3f9dSVlad Serebrennikov namespace cwg109 { // cwg109: 2.8
107d358b2deSVlad Serebrennikov   struct A { template<typename T> void f(T); };
108d358b2deSVlad Serebrennikov   template<typename T> struct B : T {
109d358b2deSVlad Serebrennikov     using T::template f;
110d358b2deSVlad Serebrennikov     // expected-error@-1 {{'template' keyword not permitted here}}
111d358b2deSVlad Serebrennikov     using T::template f<int>;
112d358b2deSVlad Serebrennikov     // expected-error@-1 {{'template' keyword not permitted here}}
113d358b2deSVlad Serebrennikov     // expected-error@-2 {{using declaration cannot refer to a template specialization}}
114d358b2deSVlad Serebrennikov     // FIXME: We shouldn't suggest using the 'template' keyword in a location where it's not valid.
115d358b2deSVlad Serebrennikov     using T::f<int>;
116d358b2deSVlad Serebrennikov     // expected-error@-1 {{use 'template' keyword to treat 'f' as a dependent template name}}
117d358b2deSVlad Serebrennikov     // expected-error@-2 {{using declaration cannot refer to a template specialization}}
118d358b2deSVlad Serebrennikov     void g() { this->f<int>(123); }
119d358b2deSVlad Serebrennikov     // expected-error@-1 {{use 'template' keyword to treat 'f' as a dependent template name}}
120d358b2deSVlad Serebrennikov   };
121463e61a0SVlad Serebrennikov } // namespace cwg109
122d358b2deSVlad Serebrennikov 
123eaea5f6fSVlad Serebrennikov namespace cwg110 { // cwg110: 2.8
124eaea5f6fSVlad Serebrennikov template <typename T>
125eaea5f6fSVlad Serebrennikov void f(T);
126eaea5f6fSVlad Serebrennikov 
127eaea5f6fSVlad Serebrennikov class f {};
128eaea5f6fSVlad Serebrennikov 
129eaea5f6fSVlad Serebrennikov template <typename T>
130eaea5f6fSVlad Serebrennikov void f(T, T);
131eaea5f6fSVlad Serebrennikov 
132eaea5f6fSVlad Serebrennikov class f g;
133eaea5f6fSVlad Serebrennikov void (*h)(int) = static_cast<void(*)(int)>(f);
134eaea5f6fSVlad Serebrennikov void (*i)(int, int) = static_cast<void(*)(int, int)>(f);
135eaea5f6fSVlad Serebrennikov } // namespace cwg110
136eaea5f6fSVlad Serebrennikov 
137d358b2deSVlad Serebrennikov namespace cwg111 { // cwg111: dup 535
138d358b2deSVlad Serebrennikov   struct A { A(); A(volatile A&, int = 0); A(A&, const char * = "foo"); };
139d358b2deSVlad Serebrennikov   struct B : A { B(); }; // #cwg111-B
140d358b2deSVlad Serebrennikov   const B b1;
141d358b2deSVlad Serebrennikov   B b2(b1);
142d358b2deSVlad Serebrennikov   // expected-error@-1 {{no matching constructor for initialization of 'B'}}
143d358b2deSVlad Serebrennikov   //   expected-note@#cwg111-B {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const B') would lose const qualifier}}
144d358b2deSVlad Serebrennikov   //   expected-note@#cwg111-B {{candidate constructor not viable: requires 0 arguments, but 1 was provided}}
145463e61a0SVlad Serebrennikov } // namespace cwg111
146d358b2deSVlad Serebrennikov 
14714ba3f9dSVlad Serebrennikov namespace cwg112 { // cwg112: 3.1
148d358b2deSVlad Serebrennikov   struct T { int n; };
149d358b2deSVlad Serebrennikov   typedef T Arr[1];
150d358b2deSVlad Serebrennikov 
151d358b2deSVlad Serebrennikov   const T a1[1] = {}; // #cwg112-a1
152d358b2deSVlad Serebrennikov   volatile T a2[1] = {};
153d358b2deSVlad Serebrennikov   const Arr a3 = {}; // #cwg112-a3
154d358b2deSVlad Serebrennikov   volatile Arr a4 = {};
155d358b2deSVlad Serebrennikov   template<const volatile T*> struct X {};
156d358b2deSVlad Serebrennikov   // FIXME: Test this somehow in C++11 and on.
157d358b2deSVlad Serebrennikov   X<a1> x1;
158d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{non-type template argument referring to object 'a1' with internal linkage is a C++11 extension}}
159d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg112-a1 {{non-type template argument refers to object here}}
160d358b2deSVlad Serebrennikov   X<a2> x2;
161d358b2deSVlad Serebrennikov   X<a3> x3;
162d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{non-type template argument referring to object 'a3' with internal linkage is a C++11 extension}}
163d358b2deSVlad Serebrennikov   //   cxx98-note@#cwg112-a3 {{non-type template argument refers to object here}}
164d358b2deSVlad Serebrennikov   X<a4> x4;
165463e61a0SVlad Serebrennikov } // namespace cwg112
166d358b2deSVlad Serebrennikov 
16714ba3f9dSVlad Serebrennikov namespace cwg113 { // cwg113: 2.7
168d358b2deSVlad Serebrennikov   extern void (*p)();
169d358b2deSVlad Serebrennikov   void f() {
170d358b2deSVlad Serebrennikov     no_such_function();
171d358b2deSVlad Serebrennikov     // expected-error@-1 {{use of undeclared identifier 'no_such_function'}}
172d358b2deSVlad Serebrennikov     p();
173d358b2deSVlad Serebrennikov   }
174d358b2deSVlad Serebrennikov   void g();
175d358b2deSVlad Serebrennikov   void (*p)() = &g;
176463e61a0SVlad Serebrennikov } // namespace cwg113
177d358b2deSVlad Serebrennikov 
17814ba3f9dSVlad Serebrennikov namespace cwg114 { // cwg114: 2.7
179d358b2deSVlad Serebrennikov   struct A {
180d358b2deSVlad Serebrennikov     virtual void f(int) = 0; // #cwg114-A-f
181d358b2deSVlad Serebrennikov   };
182d358b2deSVlad Serebrennikov   struct B : A {
183d358b2deSVlad Serebrennikov     template<typename T> void f(T);
184d358b2deSVlad Serebrennikov     void g() { f(0); }
185d358b2deSVlad Serebrennikov   } b;
186d358b2deSVlad Serebrennikov   // expected-error@-1 {{variable type 'struct B' is an abstract class}}
187d358b2deSVlad Serebrennikov   //   expected-note@#cwg114-A-f {{unimplemented pure virtual method 'f' in 'B'}}
188463e61a0SVlad Serebrennikov } // namespace cwg114
189d358b2deSVlad Serebrennikov 
190d358b2deSVlad Serebrennikov namespace cwg115 { // cwg115: 3.0
191d358b2deSVlad Serebrennikov   template<typename T> int f(T); // #cwg115-f
192d358b2deSVlad Serebrennikov   template<typename T> int g(T); // #cwg115-g
193d358b2deSVlad Serebrennikov   template<typename T> int g(T, int); // #cwg115-g-int
194d358b2deSVlad Serebrennikov 
195d358b2deSVlad Serebrennikov   int k1 = f(&f);
196d358b2deSVlad Serebrennikov   // expected-error@-1 {{no matching function for call to 'f'}}
197d358b2deSVlad Serebrennikov   //   expected-note@#cwg115-f {{candidate template ignored: couldn't infer template argument 'T'}}
198d358b2deSVlad Serebrennikov   int k2 = f(&f<int>);
199d358b2deSVlad Serebrennikov   int k3 = f(&g<int>);
200d358b2deSVlad Serebrennikov   // expected-error@-1 {{no matching function for call to 'f'}}
201d358b2deSVlad Serebrennikov   //   expected-note@#cwg115-f {{candidate template ignored: couldn't infer template argument 'T'}}
202d358b2deSVlad Serebrennikov 
203d358b2deSVlad Serebrennikov   void h() {
204d358b2deSVlad Serebrennikov     (void)&f;
205d358b2deSVlad Serebrennikov     // expected-error@-1 {{address of overloaded function 'f' cannot be cast to type 'void'}}
206d358b2deSVlad Serebrennikov     //   expected-note@#cwg115-f {{candidate function template}}
207d358b2deSVlad Serebrennikov     (void)&f<int>;
208d358b2deSVlad Serebrennikov     (void)&g<int>;
209d358b2deSVlad Serebrennikov     // expected-error@-1 {{address of overloaded function 'g' cannot be cast to type 'void'}}
210d358b2deSVlad Serebrennikov     //   expected-note@#cwg115-g-int {{candidate function template}}
211d358b2deSVlad Serebrennikov     //   expected-note@#cwg115-g {{candidate function template}}
212d358b2deSVlad Serebrennikov 
213d358b2deSVlad Serebrennikov     &f;
214d358b2deSVlad Serebrennikov     // expected-error@-1 {{reference to overloaded function could not be resolved; did you mean to call it?}}
215d358b2deSVlad Serebrennikov     //   expected-note@#cwg115-f {{possible target for call}}
216d358b2deSVlad Serebrennikov     &f<int>;
217d358b2deSVlad Serebrennikov     // expected-warning@-1 {{expression result unused}}
218d358b2deSVlad Serebrennikov     &g<int>;
219d358b2deSVlad Serebrennikov     // expected-error@-1 {{reference to overloaded function could not be resolved; did you mean to call it?}}
220d358b2deSVlad Serebrennikov     //   expected-note@#cwg115-g-int {{possible target for call}}
221d358b2deSVlad Serebrennikov     //   expected-note@#cwg115-g {{possible target for call}}
222d358b2deSVlad Serebrennikov   }
223d358b2deSVlad Serebrennikov 
224d358b2deSVlad Serebrennikov   struct S {
225d358b2deSVlad Serebrennikov     template<typename T> static int f(T);
226d358b2deSVlad Serebrennikov     template<typename T> static int g(T);
227d358b2deSVlad Serebrennikov     template<typename T> static int g(T, int);
228d358b2deSVlad Serebrennikov   } s;
229d358b2deSVlad Serebrennikov 
230d358b2deSVlad Serebrennikov   int k4 = f(&s.f);
231d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot create a non-constant pointer to member function}}
232d358b2deSVlad Serebrennikov   int k5 = f(&s.f<int>);
233d358b2deSVlad Serebrennikov   int k6 = f(&s.g<int>);
234d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot create a non-constant pointer to member function}}
235d358b2deSVlad Serebrennikov 
236d358b2deSVlad Serebrennikov   void i() {
237d358b2deSVlad Serebrennikov     (void)&s.f;
238d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot create a non-constant pointer to member function}}
239d358b2deSVlad Serebrennikov     (void)&s.f<int>;
240d358b2deSVlad Serebrennikov     (void)&s.g<int>;
241d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot create a non-constant pointer to member function}}
242d358b2deSVlad Serebrennikov 
243d358b2deSVlad Serebrennikov     &s.f;
244d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot create a non-constant pointer to member function}}
245d358b2deSVlad Serebrennikov     &s.f<int>;
246d358b2deSVlad Serebrennikov     // expected-warning@-1 {{expression result unused}}
247d358b2deSVlad Serebrennikov     &s.g<int>;
248d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot create a non-constant pointer to member function}}
249d358b2deSVlad Serebrennikov   }
250d358b2deSVlad Serebrennikov 
251d358b2deSVlad Serebrennikov   struct T {
252d358b2deSVlad Serebrennikov     template<typename T> int f(T);
253d358b2deSVlad Serebrennikov     template<typename T> int g(T);
254d358b2deSVlad Serebrennikov     template<typename T> int g(T, int);
255d358b2deSVlad Serebrennikov   } t;
256d358b2deSVlad Serebrennikov 
257d358b2deSVlad Serebrennikov   int k7 = f(&s.f);
258d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot create a non-constant pointer to member function}}
259d358b2deSVlad Serebrennikov   int k8 = f(&s.f<int>);
260d358b2deSVlad Serebrennikov   int k9 = f(&s.g<int>);
261d358b2deSVlad Serebrennikov   // expected-error@-1 {{cannot create a non-constant pointer to member function}}
262d358b2deSVlad Serebrennikov 
263d358b2deSVlad Serebrennikov   void j() {
264d358b2deSVlad Serebrennikov     (void)&s.f;
265d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot create a non-constant pointer to member function}}
266d358b2deSVlad Serebrennikov     (void)&s.f<int>;
267d358b2deSVlad Serebrennikov     (void)&s.g<int>;
268d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot create a non-constant pointer to member function}}
269d358b2deSVlad Serebrennikov 
270d358b2deSVlad Serebrennikov     &s.f;
271d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot create a non-constant pointer to member function}}
272d358b2deSVlad Serebrennikov     &s.f<int>;
273d358b2deSVlad Serebrennikov     // expected-warning@-1 {{expression result unused}}
274d358b2deSVlad Serebrennikov     &s.g<int>;
275d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot create a non-constant pointer to member function}}
276d358b2deSVlad Serebrennikov   }
277d358b2deSVlad Serebrennikov 
278d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
279d358b2deSVlad Serebrennikov   // Special case kicks in only if a template argument list is specified.
280d358b2deSVlad Serebrennikov   template<typename T=int> void with_default(); // #cwg115-with-default
281d358b2deSVlad Serebrennikov   int k10 = f(&with_default);
282eff12650SVlad Serebrennikov   // since-cxx11-error@-1 {{no matching function for call to 'f'}}
283eff12650SVlad Serebrennikov   //   since-cxx11-note@#cwg115-f {{candidate template ignored: couldn't infer template argument 'T'}}
284d358b2deSVlad Serebrennikov   int k11 = f(&with_default<>);
285d358b2deSVlad Serebrennikov   void k() {
286d358b2deSVlad Serebrennikov     (void)&with_default;
287eff12650SVlad Serebrennikov     // since-cxx11-error@-1 {{address of overloaded function 'with_default' cannot be cast to type 'void'}}
288eff12650SVlad Serebrennikov     //   since-cxx11-note@#cwg115-with-default {{candidate function template}}
289d358b2deSVlad Serebrennikov     (void)&with_default<>;
290d358b2deSVlad Serebrennikov     &with_default;
291eff12650SVlad Serebrennikov     // since-cxx11-error@-1 {{reference to overloaded function could not be resolved; did you mean to call it?}}
292eff12650SVlad Serebrennikov     //   since-cxx11-note@#cwg115-with-default {{possible target for call}}
293d358b2deSVlad Serebrennikov     &with_default<>;
294eff12650SVlad Serebrennikov     // since-cxx11-warning@-1 {{expression result unused}}
295d358b2deSVlad Serebrennikov   }
296d358b2deSVlad Serebrennikov #endif
297463e61a0SVlad Serebrennikov } // namespace cwg115
298d358b2deSVlad Serebrennikov 
29914ba3f9dSVlad Serebrennikov namespace cwg116 { // cwg116: 2.7
300d358b2deSVlad Serebrennikov   template<int> struct A {};
301d358b2deSVlad Serebrennikov   template<int N> void f(A<N>) {} // #cwg116-f-N
302d358b2deSVlad Serebrennikov   template<int M> void f(A<M>) {}
303d358b2deSVlad Serebrennikov   // expected-error@-1 {{redefinition of 'f'}}
304d358b2deSVlad Serebrennikov   //   expected-note@#cwg116-f-N {{previous definition is here}}
305d358b2deSVlad Serebrennikov   template<typename T> void f(A<sizeof(T)>) {} // #cwg116-f-T
306d358b2deSVlad Serebrennikov   template<typename U> void f(A<sizeof(U)>) {}
307d358b2deSVlad Serebrennikov   // expected-error@-1 {{redefinition of 'f'}}
308d358b2deSVlad Serebrennikov   //   expected-note@#cwg116-f-T {{previous definition is here}}
309463e61a0SVlad Serebrennikov } // namespace cwg116
310d358b2deSVlad Serebrennikov 
311d358b2deSVlad Serebrennikov // cwg117: na
312d358b2deSVlad Serebrennikov // cwg118 is in cwg118.cpp
313d358b2deSVlad Serebrennikov // cwg119: na
314d358b2deSVlad Serebrennikov // cwg120: na
315d358b2deSVlad Serebrennikov 
31614ba3f9dSVlad Serebrennikov namespace cwg121 { // cwg121: 2.7
317d358b2deSVlad Serebrennikov   struct X {
318d358b2deSVlad Serebrennikov     template<typename T> struct Y {};
319d358b2deSVlad Serebrennikov   };
320d358b2deSVlad Serebrennikov   template<typename T> struct Z {
321d358b2deSVlad Serebrennikov     X::Y<T> x;
322d358b2deSVlad Serebrennikov     T::Y<T> y;
323d358b2deSVlad Serebrennikov     // expected-error@-1 {{use 'template' keyword to treat 'Y' as a dependent template name}}
324d358b2deSVlad Serebrennikov     // cxx98-17-error@-2 {{missing 'typename' prior to dependent type name T::Y; implicit 'typename' is a C++20 extension}}
325d358b2deSVlad Serebrennikov   };
326d358b2deSVlad Serebrennikov   Z<X> z;
327463e61a0SVlad Serebrennikov } // namespace cwg121
328d358b2deSVlad Serebrennikov 
32914ba3f9dSVlad Serebrennikov namespace cwg122 { // cwg122: 2.7
330d358b2deSVlad Serebrennikov   template<typename T> void f();
331d358b2deSVlad Serebrennikov   void g() { f<int>(); }
332463e61a0SVlad Serebrennikov } // namespace cwg122
333d358b2deSVlad Serebrennikov 
334d358b2deSVlad Serebrennikov // cwg123: na
335d358b2deSVlad Serebrennikov // cwg124 is in cwg124.cpp
336d358b2deSVlad Serebrennikov 
33714ba3f9dSVlad Serebrennikov // cwg125: 2.7
338d358b2deSVlad Serebrennikov struct cwg125_A { struct cwg125_B {}; }; // #cwg125_B
339d358b2deSVlad Serebrennikov cwg125_A::cwg125_B cwg125_C();
340d358b2deSVlad Serebrennikov namespace cwg125_B { cwg125_A cwg125_C(); }
341d358b2deSVlad Serebrennikov namespace cwg125 {
342d358b2deSVlad Serebrennikov   struct X {
343d358b2deSVlad Serebrennikov     friend cwg125_A::cwg125_B (::cwg125_C)(); // ok
344d358b2deSVlad Serebrennikov     friend cwg125_A (::cwg125_B::cwg125_C)(); // ok
345d358b2deSVlad Serebrennikov     friend cwg125_A::cwg125_B::cwg125_C(); // #cwg125_C
346d358b2deSVlad Serebrennikov     // expected-error@#cwg125_C {{missing return type for function 'cwg125_C'; did you mean the constructor name 'cwg125_B'?}}
347d358b2deSVlad Serebrennikov     // cxx98-error@#cwg125_C {{'cwg125_B' is missing exception specification 'throw()'}}
348d358b2deSVlad Serebrennikov     //   cxx98-note@#cwg125_B {{previous declaration is here}}
349d358b2deSVlad Serebrennikov     // since-cxx11-error@#cwg125_C {{'cwg125_B' is missing exception specification 'noexcept'}}
350d358b2deSVlad Serebrennikov     //   since-cxx11-note@#cwg125_B {{previous declaration is here}}
351d358b2deSVlad Serebrennikov   };
352463e61a0SVlad Serebrennikov } // namespace cwg125
353d358b2deSVlad Serebrennikov 
354d358b2deSVlad Serebrennikov namespace cwg126 { // cwg126: partial
355d358b2deSVlad Serebrennikov   // FIXME: We do not yet generate correct code for this change:
356d358b2deSVlad Serebrennikov   // eg:
357d358b2deSVlad Serebrennikov   //   catch (void*&) should catch void* but not int*
358d358b2deSVlad Serebrennikov   //   catch (void*) and catch (void*const&) should catch both
359d358b2deSVlad Serebrennikov   // Likewise:
360d358b2deSVlad Serebrennikov   //   catch (Base *&) should catch Base* but not Derived*
361d358b2deSVlad Serebrennikov   //   catch (Base *) should catch both
362d358b2deSVlad Serebrennikov   // In each case, we emit the same code for both catches.
363d358b2deSVlad Serebrennikov   //
364d358b2deSVlad Serebrennikov   // The ABI does not let us represent the language rule in the unwind tables.
365d358b2deSVlad Serebrennikov   // So, when catching by non-const (or volatile) reference to pointer, we
366d358b2deSVlad Serebrennikov   // should compare the exception type to the caught type and only accept an
367d358b2deSVlad Serebrennikov   // exact match.
368d358b2deSVlad Serebrennikov   struct C {};
369d358b2deSVlad Serebrennikov   struct D : C {};
370d358b2deSVlad Serebrennikov   struct E : private C { friend class A; friend class B; };
371d358b2deSVlad Serebrennikov   struct F : protected C {};
372d358b2deSVlad Serebrennikov   struct G : C {};
373d358b2deSVlad Serebrennikov   struct H : D, G {};
374d358b2deSVlad Serebrennikov 
375d358b2deSVlad Serebrennikov #if __cplusplus <= 201402L
376d358b2deSVlad Serebrennikov   struct A {
377d358b2deSVlad Serebrennikov     virtual void cp() throw(C*);
378d358b2deSVlad Serebrennikov     virtual void dp() throw(C*);
379d358b2deSVlad Serebrennikov     virtual void ep() throw(C*); // #cwg126-ep
380d358b2deSVlad Serebrennikov     virtual void fp() throw(C*); // #cwg126-fp
381d358b2deSVlad Serebrennikov     virtual void gp() throw(C*);
382d358b2deSVlad Serebrennikov     virtual void hp() throw(C*); // #cwg126-hp
383d358b2deSVlad Serebrennikov 
384d358b2deSVlad Serebrennikov     virtual void cr() throw(C&);
385d358b2deSVlad Serebrennikov     virtual void dr() throw(C&);
386d358b2deSVlad Serebrennikov     virtual void er() throw(C&); // #cwg126-er
387d358b2deSVlad Serebrennikov     virtual void fr() throw(C&); // #cwg126-fr
388d358b2deSVlad Serebrennikov     virtual void gr() throw(C&);
389d358b2deSVlad Serebrennikov     virtual void hr() throw(C&); // #cwg126-hr
390d358b2deSVlad Serebrennikov 
391d358b2deSVlad Serebrennikov     virtual void pv() throw(void*);
392d358b2deSVlad Serebrennikov 
393d358b2deSVlad Serebrennikov     virtual void np() throw(C*);
394d358b2deSVlad Serebrennikov     virtual void npm() throw(int C::*);
395d358b2deSVlad Serebrennikov     virtual void nr() throw(C*&); // #cwg126-nr
396d358b2deSVlad Serebrennikov     virtual void ncr() throw(C*const&);
397d358b2deSVlad Serebrennikov 
398d358b2deSVlad Serebrennikov     virtual void ref1() throw(C *const&);
399d358b2deSVlad Serebrennikov     virtual void ref2() throw(C *);
400d358b2deSVlad Serebrennikov 
401d358b2deSVlad Serebrennikov     virtual void v() throw(int);
402d358b2deSVlad Serebrennikov     virtual void w() throw(const int);
403d358b2deSVlad Serebrennikov     virtual void x() throw(int*); // #cwg126-x
404d358b2deSVlad Serebrennikov     virtual void y() throw(const int*);
405d358b2deSVlad Serebrennikov     virtual void z() throw(int); // #cwg126-z
406d358b2deSVlad Serebrennikov   };
407d358b2deSVlad Serebrennikov   struct B : A {
408d358b2deSVlad Serebrennikov     virtual void cp() throw(C*);
409d358b2deSVlad Serebrennikov     virtual void dp() throw(D*);
410d358b2deSVlad Serebrennikov     virtual void ep() throw(E*);
411d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{exception specification of overriding function is more lax than base version}}
412d358b2deSVlad Serebrennikov     //   cxx98-14-note@#cwg126-ep {{overridden virtual function is here}}
413d358b2deSVlad Serebrennikov     virtual void fp() throw(F*);
414d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{exception specification of overriding function is more lax than base version}}
415d358b2deSVlad Serebrennikov     //   cxx98-14-note@#cwg126-fp {{overridden virtual function is here}}
416d358b2deSVlad Serebrennikov     virtual void gp() throw(G*);
417d358b2deSVlad Serebrennikov     virtual void hp() throw(H*);
418d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{exception specification of overriding function is more lax than base version}}
419d358b2deSVlad Serebrennikov     //   cxx98-14-note@#cwg126-hp {{overridden virtual function is here}}
420d358b2deSVlad Serebrennikov 
421d358b2deSVlad Serebrennikov     virtual void cr() throw(C&);
422d358b2deSVlad Serebrennikov     virtual void dr() throw(D&);
423d358b2deSVlad Serebrennikov     virtual void er() throw(E&);
424d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{exception specification of overriding function is more lax than base version}}
425d358b2deSVlad Serebrennikov     //   cxx98-14-note@#cwg126-er {{overridden virtual function is here}}
426d358b2deSVlad Serebrennikov     virtual void fr() throw(F&);
427d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{exception specification of overriding function is more lax than base version}}
428d358b2deSVlad Serebrennikov     //   cxx98-14-note@#cwg126-fr {{overridden virtual function is here}}
429d358b2deSVlad Serebrennikov     virtual void gr() throw(G&);
430d358b2deSVlad Serebrennikov     virtual void hr() throw(H&);
431d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{exception specification of overriding function is more lax than base version}}
432d358b2deSVlad Serebrennikov     //   cxx98-14-note@#cwg126-hr {{overridden virtual function is here}}
433d358b2deSVlad Serebrennikov 
434d358b2deSVlad Serebrennikov     virtual void pv() throw(C*);
435d358b2deSVlad Serebrennikov 
436d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
437d358b2deSVlad Serebrennikov     using nullptr_t = decltype(nullptr);
438d358b2deSVlad Serebrennikov     virtual void np() throw(nullptr_t);
439d358b2deSVlad Serebrennikov     virtual void npm() throw(nullptr_t&);
440d358b2deSVlad Serebrennikov     virtual void nr() throw(nullptr_t);
441d358b2deSVlad Serebrennikov     // cxx11-14-error@-1 {{exception specification of overriding function is more lax than base version}}
442d358b2deSVlad Serebrennikov     //   cxx11-14-note@#cwg126-nr {{overridden virtual function is here}}
443d358b2deSVlad Serebrennikov     virtual void ncr() throw(nullptr_t);
444d358b2deSVlad Serebrennikov #endif // __cplusplus >= 201103L
445d358b2deSVlad Serebrennikov 
446d358b2deSVlad Serebrennikov     virtual void ref1() throw(D *const &);
447d358b2deSVlad Serebrennikov     virtual void ref2() throw(D *);
448d358b2deSVlad Serebrennikov 
449d358b2deSVlad Serebrennikov     virtual void v() throw(const int);
450d358b2deSVlad Serebrennikov     virtual void w() throw(int);
451d358b2deSVlad Serebrennikov     virtual void x() throw(const int*);
452d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{exception specification of overriding function is more lax than base version}}
453d358b2deSVlad Serebrennikov     //   cxx98-14-note@#cwg126-x {{overridden virtual function is here}}
454d358b2deSVlad Serebrennikov     virtual void y() throw(int*); // ok
455d358b2deSVlad Serebrennikov     virtual void z() throw(long);
456d358b2deSVlad Serebrennikov     // cxx98-14-error@-1 {{exception specification of overriding function is more lax than base version}}
457d358b2deSVlad Serebrennikov     //   cxx98-14-note@#cwg126-z {{overridden virtual function is here}}
458d358b2deSVlad Serebrennikov   };
459d358b2deSVlad Serebrennikov #endif // __cplusplus <= 201402L
460d358b2deSVlad Serebrennikov   void f() throw(int);
461d358b2deSVlad Serebrennikov   // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}}
462d358b2deSVlad Serebrennikov   //   since-cxx17-note@-2 {{use 'noexcept(false)' instead}}
463463e61a0SVlad Serebrennikov } // namespace cwg126
464d358b2deSVlad Serebrennikov 
465d358b2deSVlad Serebrennikov namespace cwg127 { // cwg127: 2.9
466d358b2deSVlad Serebrennikov   __extension__ typedef __decltype(sizeof(0)) size_t;
467d358b2deSVlad Serebrennikov   template<typename T> struct A {
468d358b2deSVlad Serebrennikov     A() { throw 0; }
469d358b2deSVlad Serebrennikov     void *operator new(size_t, const char * = 0);
470d358b2deSVlad Serebrennikov     void operator delete(void *, const char *) { T::error; } // #cwg127-delete-const-char
471d358b2deSVlad Serebrennikov     // expected-error@#cwg127-delete-const-char {{type 'void' cannot be used prior to '::' because it has no members}}
472d358b2deSVlad Serebrennikov     //   expected-note@#cwg127-p {{in instantiation of member function 'cwg127::A<void>::operator delete' requested here}}
473d358b2deSVlad Serebrennikov     // expected-error@#cwg127-delete-const-char {{type 'int' cannot be used prior to '::' because it has no members}}
474d358b2deSVlad Serebrennikov     //   expected-note@#cwg127-q {{in instantiation of member function 'cwg127::A<int>::operator delete' requested here}}
475d358b2deSVlad Serebrennikov     void operator delete(void *) { T::error; }
476d358b2deSVlad Serebrennikov   };
477d358b2deSVlad Serebrennikov   A<void> *p = new A<void>; // #cwg127-p
478d358b2deSVlad Serebrennikov   A<int> *q = new ("") A<int>; // #cwg127-q
479463e61a0SVlad Serebrennikov } // namespace cwg127
480d358b2deSVlad Serebrennikov 
48114ba3f9dSVlad Serebrennikov namespace cwg128 { // cwg128: 2.7
482d358b2deSVlad Serebrennikov   enum E1 { e1 } x = e1;
483d358b2deSVlad Serebrennikov   enum E2 { e2 } y = static_cast<E2>(x), z = static_cast<E2>(e1);
484463e61a0SVlad Serebrennikov } // namespace cwg128
485d358b2deSVlad Serebrennikov 
486d358b2deSVlad Serebrennikov // cwg129: dup 616
487d358b2deSVlad Serebrennikov // cwg130: na
488d358b2deSVlad Serebrennikov 
489d358b2deSVlad Serebrennikov namespace cwg131 { // cwg131: sup P1949
490d358b2deSVlad Serebrennikov   const char *a_with_\u0e8c = "\u0e8c";
491d358b2deSVlad Serebrennikov   const char *b_with_\u0e8d = "\u0e8d";
492d358b2deSVlad Serebrennikov   const char *c_with_\u0e8e = "\u0e8e";
493463e61a0SVlad Serebrennikov } // namespace cwg131
494d358b2deSVlad Serebrennikov 
495d358b2deSVlad Serebrennikov namespace cwg132 { // cwg132: no
496d358b2deSVlad Serebrennikov   void f() {
497d358b2deSVlad Serebrennikov     extern struct {} x; // ok
498d358b2deSVlad Serebrennikov     extern struct S {} y; // FIXME: This is invalid.
499d358b2deSVlad Serebrennikov   }
500d358b2deSVlad Serebrennikov   static enum { E } e;
501463e61a0SVlad Serebrennikov } // namespace cwg132
502d358b2deSVlad Serebrennikov 
503d358b2deSVlad Serebrennikov // cwg133: dup 87
504d358b2deSVlad Serebrennikov // cwg134: na
505d358b2deSVlad Serebrennikov 
50614ba3f9dSVlad Serebrennikov namespace cwg135 { // cwg135: 2.7
507d358b2deSVlad Serebrennikov   struct A {
508d358b2deSVlad Serebrennikov     A f(A a) { return a; }
509d358b2deSVlad Serebrennikov     friend A g(A a) { return a; }
510d358b2deSVlad Serebrennikov     static A h(A a) { return a; }
511d358b2deSVlad Serebrennikov   };
512463e61a0SVlad Serebrennikov } // namespace cwg135
513d358b2deSVlad Serebrennikov 
514d358b2deSVlad Serebrennikov namespace cwg136 { // cwg136: 3.4
515d358b2deSVlad Serebrennikov   void f(int, int, int = 0); // #cwg136-f
516d358b2deSVlad Serebrennikov   void g(int, int, int); // #cwg136-g
517d358b2deSVlad Serebrennikov   struct A {
518d358b2deSVlad Serebrennikov     friend void f(int, int = 0, int);
519d358b2deSVlad Serebrennikov     // expected-error@-1 {{friend declaration specifying a default argument must be the only declaration}}
520d358b2deSVlad Serebrennikov     //   expected-note@#cwg136-f {{previous declaration is here}}
521d358b2deSVlad Serebrennikov     friend void g(int, int, int = 0);
522d358b2deSVlad Serebrennikov     // expected-error@-1 {{friend declaration specifying a default argument must be the only declaration}}
523d358b2deSVlad Serebrennikov     //   expected-note@#cwg136-g {{previous declaration is here}}
524d358b2deSVlad Serebrennikov     friend void h(int, int, int = 0);
525d358b2deSVlad Serebrennikov     // expected-error@-1 {{friend declaration specifying a default argument must be a definition}}
526d358b2deSVlad Serebrennikov     friend void i(int, int, int = 0) {} // #cwg136-A-i
527d358b2deSVlad Serebrennikov     friend void j(int, int, int = 0) {}
528d358b2deSVlad Serebrennikov     operator int();
529d358b2deSVlad Serebrennikov   };
530d358b2deSVlad Serebrennikov   void i(int, int, int);
531d358b2deSVlad Serebrennikov   // expected-error@-1 {{friend declaration specifying a default argument must be the only declaration}}
532d358b2deSVlad Serebrennikov   //   expected-note@#cwg136-A-i {{previous declaration is here}}
533d358b2deSVlad Serebrennikov   void q() {
534d358b2deSVlad Serebrennikov     j(A(), A()); // ok, has default argument
535d358b2deSVlad Serebrennikov   }
536d358b2deSVlad Serebrennikov   extern "C" void k(int, int, int, int); // #cwg136-k
537d358b2deSVlad Serebrennikov   namespace NSA {
538d358b2deSVlad Serebrennikov   struct A {
539d358b2deSVlad Serebrennikov     friend void cwg136::k(int, int, int, int = 0);
540d358b2deSVlad Serebrennikov     // expected-error@-1 {{friend declaration specifying a default argument must be the only declaration}}
541d358b2deSVlad Serebrennikov     //   expected-note@#cwg136-k {{previous declaration is here}}
542d358b2deSVlad Serebrennikov   };
543d358b2deSVlad Serebrennikov   }
544d358b2deSVlad Serebrennikov   namespace NSB {
545d358b2deSVlad Serebrennikov   struct A {
546d358b2deSVlad Serebrennikov     friend void cwg136::k(int, int, int = 0, int); // #cwg136-friend-k
547d358b2deSVlad Serebrennikov     // expected-error@#cwg136-friend-k {{friend declaration specifying a default argument must be the only declaration}}
548d358b2deSVlad Serebrennikov     //   expected-note@#cwg136-k {{previous declaration is here}}
549d358b2deSVlad Serebrennikov     // expected-error@#cwg136-friend-k {{missing default argument on parameter}}
550d358b2deSVlad Serebrennikov   };
551d358b2deSVlad Serebrennikov   }
552d358b2deSVlad Serebrennikov   struct B {
553d358b2deSVlad Serebrennikov     void f(int); // #cwg136-B-f
554d358b2deSVlad Serebrennikov   };
555d358b2deSVlad Serebrennikov   struct C {
556d358b2deSVlad Serebrennikov     friend void B::f(int = 0);
557d358b2deSVlad Serebrennikov     // expected-error@-1 {{friend declaration specifying a default argument must be the only declaration}}
558d358b2deSVlad Serebrennikov     //   expected-note@#cwg136-B-f {{previous declaration is here}}
559d358b2deSVlad Serebrennikov   };
560463e61a0SVlad Serebrennikov } // namespace cwg136
561d358b2deSVlad Serebrennikov 
56214ba3f9dSVlad Serebrennikov namespace cwg137 { // cwg137: 2.7
563d358b2deSVlad Serebrennikov   extern void *p;
564d358b2deSVlad Serebrennikov   extern const void *cp;
565d358b2deSVlad Serebrennikov   extern volatile void *vp;
566d358b2deSVlad Serebrennikov   extern const volatile void *cvp;
567d358b2deSVlad Serebrennikov   int *q = static_cast<int*>(p);
568d358b2deSVlad Serebrennikov   int *qc = static_cast<int*>(cp);
569d358b2deSVlad Serebrennikov   // expected-error@-1 {{static_cast from 'const void *' to 'int *' casts away qualifiers}}
570d358b2deSVlad Serebrennikov   int *qv = static_cast<int*>(vp);
571d358b2deSVlad Serebrennikov   // expected-error@-1 {{static_cast from 'volatile void *' to 'int *' casts away qualifiers}}
572d358b2deSVlad Serebrennikov   int *qcv = static_cast<int*>(cvp);
573d358b2deSVlad Serebrennikov   // expected-error@-1 {{static_cast from 'const volatile void *' to 'int *' casts away qualifiers}}
574d358b2deSVlad Serebrennikov   const int *cq = static_cast<const int*>(p);
575d358b2deSVlad Serebrennikov   const int *cqc = static_cast<const int*>(cp);
576d358b2deSVlad Serebrennikov   const int *cqv = static_cast<const int*>(vp);
577d358b2deSVlad Serebrennikov   // expected-error@-1 {{static_cast from 'volatile void *' to 'const int *' casts away qualifiers}}
578d358b2deSVlad Serebrennikov   const int *cqcv = static_cast<const int*>(cvp);
579d358b2deSVlad Serebrennikov   // expected-error@-1 {{static_cast from 'const volatile void *' to 'const int *' casts away qualifiers}}
580d358b2deSVlad Serebrennikov   const volatile int *cvq = static_cast<const volatile int*>(p);
581d358b2deSVlad Serebrennikov   const volatile int *cvqc = static_cast<const volatile int*>(cp);
582d358b2deSVlad Serebrennikov   const volatile int *cvqv = static_cast<const volatile int*>(vp);
583d358b2deSVlad Serebrennikov   const volatile int *cvqcv = static_cast<const volatile int*>(cvp);
584463e61a0SVlad Serebrennikov } // namespace cwg137
585d358b2deSVlad Serebrennikov 
5864a505e15SVlad Serebrennikov namespace cwg138 { // cwg138: partial
5874a505e15SVlad Serebrennikov namespace example1 {
5884a505e15SVlad Serebrennikov void foo(); // #cwg138-ex1-foo
5894a505e15SVlad Serebrennikov namespace A {
5904a505e15SVlad Serebrennikov   using example1::foo; // #cwg138-ex1-using
5914a505e15SVlad Serebrennikov   class X {
5924a505e15SVlad Serebrennikov     static const int i = 10;
5934a505e15SVlad Serebrennikov     // This friend declaration is using neither qualified-id nor template-id,
5944a505e15SVlad Serebrennikov     // so name 'foo' is not looked up, which means the using-declaration has no effect.
5954a505e15SVlad Serebrennikov     // Target scope of this declaration is A, so this is grating friendship to
5964a505e15SVlad Serebrennikov     // (hypothetical) A::foo instead of 'example1::foo' using declaration refers to.
5974a505e15SVlad Serebrennikov     // A::foo corresponds to example1::foo named by the using declaration,
5984a505e15SVlad Serebrennikov     // and since A::foo is a different entity, they potentially conflict.
5994a505e15SVlad Serebrennikov     // FIXME: This is ill-formed, but not for the reason diagnostic says.
6004a505e15SVlad Serebrennikov     friend void foo();
6014a505e15SVlad Serebrennikov     // expected-error@-1 {{cannot befriend target of using declaration}}
6024a505e15SVlad Serebrennikov     //   expected-note@#cwg138-ex1-foo {{target of using declaration}}
6034a505e15SVlad Serebrennikov     //   expected-note@#cwg138-ex1-using {{using declaration}}
6044a505e15SVlad Serebrennikov   };
6054a505e15SVlad Serebrennikov }
6064a505e15SVlad Serebrennikov } // namespace example1
6074a505e15SVlad Serebrennikov 
6084a505e15SVlad Serebrennikov namespace example2 {
6094a505e15SVlad Serebrennikov void f();
6104a505e15SVlad Serebrennikov void g();
6114a505e15SVlad Serebrennikov class B {
6124a505e15SVlad Serebrennikov   void g();
6134a505e15SVlad Serebrennikov };
6144a505e15SVlad Serebrennikov class A : public B {
6154a505e15SVlad Serebrennikov   static const int i = 10;
6164a505e15SVlad Serebrennikov   void f();
6174a505e15SVlad Serebrennikov   // Both friend declaration are not using qualified-ids or template-ids,
6184a505e15SVlad Serebrennikov   // so 'f' and 'g' are not looked up, which means that presence of A::f
6194a505e15SVlad Serebrennikov   // and base B have no effect.
6204a505e15SVlad Serebrennikov   // Both target scope of namespace 'example2', and grant friendship to
6214a505e15SVlad Serebrennikov   // example2::f and example2::g respectively.
6224a505e15SVlad Serebrennikov   friend void f();
6234a505e15SVlad Serebrennikov   friend void g();
6244a505e15SVlad Serebrennikov };
6254a505e15SVlad Serebrennikov void f() {
6264a505e15SVlad Serebrennikov   int i2 = A::i;
6274a505e15SVlad Serebrennikov }
6284a505e15SVlad Serebrennikov void g() {
6294a505e15SVlad Serebrennikov   int i3 = A::i;
6304a505e15SVlad Serebrennikov }
6314a505e15SVlad Serebrennikov } // namespace example2
6324a505e15SVlad Serebrennikov 
6334a505e15SVlad Serebrennikov namespace example3 {
6344a505e15SVlad Serebrennikov struct Base {
6354a505e15SVlad Serebrennikov private:
6364a505e15SVlad Serebrennikov   static const int i = 10; // #cwg138-ex3-Base-i
6374a505e15SVlad Serebrennikov 
6384a505e15SVlad Serebrennikov public:
6394a505e15SVlad Serebrennikov   struct Data;
6404a505e15SVlad Serebrennikov   // Elaborated type specifier is not the sole constituent of declaration,
6414a505e15SVlad Serebrennikov   // so 'Data' undergoes unqualified type-only lookup, which finds Base::Data.
6424a505e15SVlad Serebrennikov   friend class Data;
6434a505e15SVlad Serebrennikov 
6444a505e15SVlad Serebrennikov   struct Data {
6454a505e15SVlad Serebrennikov     void f() {
6464a505e15SVlad Serebrennikov       int i2 = Base::i;
6474a505e15SVlad Serebrennikov     }
6484a505e15SVlad Serebrennikov   };
6494a505e15SVlad Serebrennikov };
6504a505e15SVlad Serebrennikov struct Data {
6514a505e15SVlad Serebrennikov   void f() {
6524a505e15SVlad Serebrennikov     int i2 = Base::i;
6534a505e15SVlad Serebrennikov     // expected-error@-1 {{'i' is a private member of 'cwg138::example3::Base'}}
6544a505e15SVlad Serebrennikov     //   expected-note@#cwg138-ex3-Base-i {{declared private here}}
6554a505e15SVlad Serebrennikov   }
6564a505e15SVlad Serebrennikov };
6574a505e15SVlad Serebrennikov } // namespace example3
6584a505e15SVlad Serebrennikov } // namespace cwg138
6594a505e15SVlad Serebrennikov 
66014ba3f9dSVlad Serebrennikov namespace cwg139 { // cwg139: 2.7
661d358b2deSVlad Serebrennikov   namespace example1 {
662d358b2deSVlad Serebrennikov     typedef int f; // #cwg139-typedef-f
663d358b2deSVlad Serebrennikov     struct A {
664d358b2deSVlad Serebrennikov       friend void f(A &);
665d358b2deSVlad Serebrennikov       // expected-error@-1 {{redefinition of 'f' as different kind of symbol}}
666d358b2deSVlad Serebrennikov       //   expected-note@#cwg139-typedef-f {{previous definition is here}}
667d358b2deSVlad Serebrennikov     };
668d358b2deSVlad Serebrennikov   }
669d358b2deSVlad Serebrennikov 
670d358b2deSVlad Serebrennikov   namespace example2 {
671d358b2deSVlad Serebrennikov     typedef int f;
672d358b2deSVlad Serebrennikov     namespace N {
673d358b2deSVlad Serebrennikov       struct A {
674d358b2deSVlad Serebrennikov         friend void f(A &);
675d358b2deSVlad Serebrennikov         operator int();
676d358b2deSVlad Serebrennikov         void g(A a) { int i = f(a); } // ok, f is typedef not friend function
677d358b2deSVlad Serebrennikov       };
678d358b2deSVlad Serebrennikov     }
679d358b2deSVlad Serebrennikov   }
680463e61a0SVlad Serebrennikov } // namespace cwg139
681d358b2deSVlad Serebrennikov 
68214ba3f9dSVlad Serebrennikov namespace cwg140 { // cwg140: 2.7
683d358b2deSVlad Serebrennikov   void f(int *const) {} // #cwg140-f-first
684d358b2deSVlad Serebrennikov   void f(int[3]) {}
685d358b2deSVlad Serebrennikov   // expected-error@-1 {{redefinition of 'f'}}
686d358b2deSVlad Serebrennikov   //   expected-note@#cwg140-f-first {{previous definition is here}}
687d358b2deSVlad Serebrennikov   void g(const int);
688d358b2deSVlad Serebrennikov   void g(int n) { n = 2; }
689463e61a0SVlad Serebrennikov } // namespace cwg140
690d358b2deSVlad Serebrennikov 
691d358b2deSVlad Serebrennikov namespace cwg141 { // cwg141: 3.1
692d358b2deSVlad Serebrennikov   template<typename T> void f();
693d358b2deSVlad Serebrennikov   template<typename T> struct S { int n; }; // #cwg141-S
694d358b2deSVlad Serebrennikov   struct A : S<int> {
695d358b2deSVlad Serebrennikov     template<typename T> void f();
696d358b2deSVlad Serebrennikov     template<typename T> struct S {}; // #cwg141-A-S
697d358b2deSVlad Serebrennikov   } a;
698d358b2deSVlad Serebrennikov   struct B : S<int> {} b;
699d358b2deSVlad Serebrennikov   void g() {
700d358b2deSVlad Serebrennikov     a.f<int>();
701d358b2deSVlad Serebrennikov     (void)a.S<int>::n; // #cwg141-a
702d358b2deSVlad Serebrennikov     // cxx98-error@#cwg141-a {{lookup of 'S' in member access expression is ambiguous; using member of 'struct A'}}
703d358b2deSVlad Serebrennikov     //   cxx98-note@#cwg141-A-S {{lookup in the object type 'struct A' refers here}}
704d358b2deSVlad Serebrennikov     //   cxx98-note@#cwg141-S {{lookup from the current scope refers here}}
705d358b2deSVlad Serebrennikov     // expected-error@#cwg141-a {{no member named 'n' in 'cwg141::A::S<int>'; did you mean '::cwg141::S<int>::n'?}}
706d358b2deSVlad Serebrennikov     //   expected-note@#cwg141-S {{'::cwg141::S<int>::n' declared here}}
70759e56eebSHaojian Wu     // FIXME: we issue a useful diagnostic first, then some bogus ones.
708d358b2deSVlad Serebrennikov     b.f<int>();
709d358b2deSVlad Serebrennikov     // expected-error@-1 {{no member named 'f' in 'cwg141::B'}}
71059e56eebSHaojian Wu     // expected-error@-2 +{{}}
711d358b2deSVlad Serebrennikov     (void)b.S<int>::n;
712d358b2deSVlad Serebrennikov   }
713d358b2deSVlad Serebrennikov   template<typename T> struct C {
714d358b2deSVlad Serebrennikov     T t;
715d358b2deSVlad Serebrennikov     void g() {
716d358b2deSVlad Serebrennikov       t.f<int>();
717d358b2deSVlad Serebrennikov       // expected-error@-1 {{use 'template' keyword to treat 'f' as a dependent template name}}
718d358b2deSVlad Serebrennikov     }
719d358b2deSVlad Serebrennikov     void h() {
72059e56eebSHaojian Wu       (void)t.S<int>::n; // ok
721d358b2deSVlad Serebrennikov     }
722d358b2deSVlad Serebrennikov     void i() {
72359e56eebSHaojian Wu       (void)t.S<int>(); // ok!
724d358b2deSVlad Serebrennikov     }
725d358b2deSVlad Serebrennikov   };
726d358b2deSVlad Serebrennikov   void h() { C<B>().h(); } // ok
727d358b2deSVlad Serebrennikov   struct X {
728d358b2deSVlad Serebrennikov     template<typename T> void S();
729d358b2deSVlad Serebrennikov   };
730d358b2deSVlad Serebrennikov   void i() { C<X>().i(); } // ok!!
731463e61a0SVlad Serebrennikov } // namespace cwg141
732d358b2deSVlad Serebrennikov 
733d358b2deSVlad Serebrennikov namespace cwg142 { // cwg142: 2.8
734d358b2deSVlad Serebrennikov   class B { // #cwg142-B
735d358b2deSVlad Serebrennikov   public:
736d358b2deSVlad Serebrennikov     int mi; // #cwg142-B-mi
737d358b2deSVlad Serebrennikov     static int si; // #cwg142-B-si
738d358b2deSVlad Serebrennikov   };
739d358b2deSVlad Serebrennikov   class D : private B { // #cwg142-D
740d358b2deSVlad Serebrennikov   };
741d358b2deSVlad Serebrennikov   class DD : public D {
742d358b2deSVlad Serebrennikov     void f();
743d358b2deSVlad Serebrennikov   };
744d358b2deSVlad Serebrennikov   void DD::f() {
745d358b2deSVlad Serebrennikov     mi = 3;
746d358b2deSVlad Serebrennikov     // expected-error@-1 {{'mi' is a private member of 'cwg142::B'}}
747d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{constrained by private inheritance here}}
748d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-B-mi {{member is declared here}}
749d358b2deSVlad Serebrennikov     si = 3;
750d358b2deSVlad Serebrennikov     // expected-error@-1 {{'si' is a private member of 'cwg142::B'}}
751d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{constrained by private inheritance here}}
752d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-B-si {{member is declared here}}
753d358b2deSVlad Serebrennikov     B b_old;
754d358b2deSVlad Serebrennikov     // expected-error@-1 {{'B' is a private member of 'cwg142::B'}}
755d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{constrained by private inheritance here}}
756d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-B {{member is declared here}}
757d358b2deSVlad Serebrennikov     cwg142::B b;
758d358b2deSVlad Serebrennikov     b.mi = 3;
759d358b2deSVlad Serebrennikov     b.si = 3;
760d358b2deSVlad Serebrennikov     B::si = 3;
761d358b2deSVlad Serebrennikov     // expected-error@-1 {{'B' is a private member of 'cwg142::B'}}
762d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{constrained by private inheritance here}}
763d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-B {{member is declared here}}
764d358b2deSVlad Serebrennikov     cwg142::B::si = 3;
765d358b2deSVlad Serebrennikov     B *bp1_old = this; // #cwg142-bp1_old
766d358b2deSVlad Serebrennikov     // expected-error@#cwg142-bp1_old {{'B' is a private member of 'cwg142::B'}}
767d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{constrained by private inheritance here}}
768d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-B {{member is declared here}}
769d358b2deSVlad Serebrennikov     // expected-error@#cwg142-bp1_old {{cannot cast 'cwg142::DD' to its private base class 'B'}}
770d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{declared private here}}
771d358b2deSVlad Serebrennikov     cwg142::B *bp1 = this;
772d358b2deSVlad Serebrennikov     // expected-error@-1 {{cannot cast 'cwg142::DD' to its private base class 'cwg142::B'}}
773d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{declared private here}}
774d358b2deSVlad Serebrennikov     B *bp2_old = (B*)this; // #cwg142-bp2_old
775d358b2deSVlad Serebrennikov     // expected-error@#cwg142-bp2_old {{'B' is a private member of 'cwg142::B'}}
776d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{constrained by private inheritance here}}
777d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-B {{member is declared here}}
778d358b2deSVlad Serebrennikov     // expected-error@#cwg142-bp2_old {{'B' is a private member of 'cwg142::B'}}
779d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-D {{constrained by private inheritance here}}
780d358b2deSVlad Serebrennikov     //   expected-note@#cwg142-B {{member is declared here}}
781d358b2deSVlad Serebrennikov     cwg142::B *bp2 = (cwg142::B*)this;
782d358b2deSVlad Serebrennikov     bp2->mi = 3;
783d358b2deSVlad Serebrennikov   }
784463e61a0SVlad Serebrennikov } // namespace cwg142
785d358b2deSVlad Serebrennikov 
78614ba3f9dSVlad Serebrennikov namespace cwg143 { // cwg143: 2.7
787d358b2deSVlad Serebrennikov   namespace A { struct X; }
788d358b2deSVlad Serebrennikov   namespace B { void f(A::X); }
789d358b2deSVlad Serebrennikov   namespace A {
790d358b2deSVlad Serebrennikov     struct X { friend void B::f(X); };
791d358b2deSVlad Serebrennikov   }
792d358b2deSVlad Serebrennikov   void g(A::X x) {
793d358b2deSVlad Serebrennikov     f(x);
794d358b2deSVlad Serebrennikov     // expected-error@-1 {{use of undeclared identifier 'f'}}
795d358b2deSVlad Serebrennikov   }
796463e61a0SVlad Serebrennikov } // namespace cwg143
797d358b2deSVlad Serebrennikov 
79814ba3f9dSVlad Serebrennikov namespace cwg145 { // cwg145: 2.7
799d358b2deSVlad Serebrennikov   void f(bool b) {
800d358b2deSVlad Serebrennikov     ++b;
801d358b2deSVlad Serebrennikov     // cxx98-14-warning@-1 {{incrementing expression of type bool is deprecated and incompatible with C++17}}
802d358b2deSVlad Serebrennikov     // since-cxx17-error@-2 {{ISO C++17 does not allow incrementing expression of type bool}}
803d358b2deSVlad Serebrennikov     b++;
804d358b2deSVlad Serebrennikov     // cxx98-14-warning@-1 {{incrementing expression of type bool is deprecated and incompatible with C++17}}
805d358b2deSVlad Serebrennikov     // since-cxx17-error@-2 {{ISO C++17 does not allow incrementing expression of type bool}}
806d358b2deSVlad Serebrennikov   }
807463e61a0SVlad Serebrennikov } // namespace cwg145
808d358b2deSVlad Serebrennikov 
80914ba3f9dSVlad Serebrennikov namespace cwg147 { // cwg147: 2.7
810d358b2deSVlad Serebrennikov   namespace example1 {
811d358b2deSVlad Serebrennikov     template<typename> struct A {
812d358b2deSVlad Serebrennikov       template<typename T> A(T);
813d358b2deSVlad Serebrennikov     };
814d358b2deSVlad Serebrennikov     // Per core issue 1435, this is ill-formed because A<int>::A<int> does not
815d358b2deSVlad Serebrennikov     // name the injected-class-name. (A<int>::A does, though.)
816d358b2deSVlad Serebrennikov     template<> template<> A<int>::A<int>(int) {}
817d358b2deSVlad Serebrennikov     // expected-error@-1 {{out-of-line constructor for 'A' cannot have template arguments}}
818d358b2deSVlad Serebrennikov     template<> template<> A<float>::A(float) {}
819d358b2deSVlad Serebrennikov   }
820d358b2deSVlad Serebrennikov   namespace example2 {
821d358b2deSVlad Serebrennikov     struct A { A(); };
822d358b2deSVlad Serebrennikov     struct B : A { B(); };
823d358b2deSVlad Serebrennikov     A::A a1;
824d358b2deSVlad Serebrennikov     // expected-error@-1 {{qualified reference to 'A' is a constructor name rather than a type in this context}}
825d358b2deSVlad Serebrennikov     B::A a2;
826d358b2deSVlad Serebrennikov   }
827d358b2deSVlad Serebrennikov   namespace example3 {
828d358b2deSVlad Serebrennikov     template<typename> struct A {
829d358b2deSVlad Serebrennikov       template<typename T> A(T);
830d358b2deSVlad Serebrennikov       static A a;
831d358b2deSVlad Serebrennikov     };
832d358b2deSVlad Serebrennikov     template<> A<int>::A<int>(A<int>::a);
833d358b2deSVlad Serebrennikov     // expected-error@-1 {{qualified reference to 'A' is a constructor name rather than a template name in this context}}
834d358b2deSVlad Serebrennikov   }
835463e61a0SVlad Serebrennikov } // namespace cwg147
836d358b2deSVlad Serebrennikov 
83714ba3f9dSVlad Serebrennikov namespace cwg148 { // cwg148: 2.7
838d358b2deSVlad Serebrennikov   struct A { int A::*p; };
839d358b2deSVlad Serebrennikov   static_assert(__is_pod(int(A::*)), "");
840d358b2deSVlad Serebrennikov   static_assert(__is_pod(A), "");
841463e61a0SVlad Serebrennikov } // namespace cwg148
842d358b2deSVlad Serebrennikov 
843d358b2deSVlad Serebrennikov // cwg149: na
844d358b2deSVlad Serebrennikov 
8450eb4bf2fSMatheus Izvekov namespace cwg150 { // cwg150: 19
8460eb4bf2fSMatheus Izvekov   namespace p1 {
8470eb4bf2fSMatheus Izvekov     template <class T, class U = int>
8480eb4bf2fSMatheus Izvekov     class ARG { };
8490eb4bf2fSMatheus Izvekov 
8500eb4bf2fSMatheus Izvekov     template <class X, template <class Y> class PARM>
8510eb4bf2fSMatheus Izvekov     void f(PARM<X>) { }
8520eb4bf2fSMatheus Izvekov 
8530eb4bf2fSMatheus Izvekov     void g() {
8540eb4bf2fSMatheus Izvekov       ARG<int> x;
8550eb4bf2fSMatheus Izvekov       f(x);
8560eb4bf2fSMatheus Izvekov     }
8570eb4bf2fSMatheus Izvekov   } // namespace p1
8580eb4bf2fSMatheus Izvekov 
8590eb4bf2fSMatheus Izvekov   namespace p2 {
8600eb4bf2fSMatheus Izvekov     template <template <class T, class U = int> class PARM>
8610eb4bf2fSMatheus Izvekov     class C {
8620eb4bf2fSMatheus Izvekov       PARM<int> pi;
8630eb4bf2fSMatheus Izvekov     };
8640eb4bf2fSMatheus Izvekov   } // namespace p2
8650eb4bf2fSMatheus Izvekov 
8660eb4bf2fSMatheus Izvekov   namespace n1 {
8670eb4bf2fSMatheus Izvekov     struct Dense { static const unsigned int dim = 1; };
8680eb4bf2fSMatheus Izvekov 
8690eb4bf2fSMatheus Izvekov     template <template <typename> class View,
8700eb4bf2fSMatheus Izvekov               typename Block>
8710eb4bf2fSMatheus Izvekov     void operator+(float, View<Block> const&);
8720eb4bf2fSMatheus Izvekov 
8730eb4bf2fSMatheus Izvekov     template <typename Block,
8740eb4bf2fSMatheus Izvekov               unsigned int Dim = Block::dim>
8750eb4bf2fSMatheus Izvekov     class Lvalue_proxy { operator float() const; };
8760eb4bf2fSMatheus Izvekov 
8770eb4bf2fSMatheus Izvekov     void test_1d (void) {
8780eb4bf2fSMatheus Izvekov       Lvalue_proxy<Dense> p;
8790eb4bf2fSMatheus Izvekov       float b;
8800eb4bf2fSMatheus Izvekov       b + p;
8810eb4bf2fSMatheus Izvekov     }
8820eb4bf2fSMatheus Izvekov   } // namespace n1
883463e61a0SVlad Serebrennikov } // namespace cwg150
8840eb4bf2fSMatheus Izvekov 
885d358b2deSVlad Serebrennikov namespace cwg151 { // cwg151: 3.1
886d358b2deSVlad Serebrennikov   struct X {};
887d358b2deSVlad Serebrennikov   typedef int X::*p;
888d358b2deSVlad Serebrennikov   static_assert(__enable_constant_folding(p() == 0), "");
889463e61a0SVlad Serebrennikov } // namespace cwg151
890d358b2deSVlad Serebrennikov 
89114ba3f9dSVlad Serebrennikov namespace cwg152 { // cwg152: 2.7
892d358b2deSVlad Serebrennikov   struct A {
893d358b2deSVlad Serebrennikov     A(); // #cwg152-A-ctor
894d358b2deSVlad Serebrennikov     explicit A(const A&); // #cwg152-A-explicit-ctor
895d358b2deSVlad Serebrennikov   };
896d358b2deSVlad Serebrennikov   A a1 = A();
897d358b2deSVlad Serebrennikov   // cxx98-14-error@-1 {{no matching constructor for initialization of 'A'}}
898d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg152-A-explicit-ctor {{explicit constructor is not a candidate}}
899d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg152-A-ctor {{candidate constructor not viable: requires 0 arguments, but 1 was provided}}
900d358b2deSVlad Serebrennikov   A a2((A()));
901d358b2deSVlad Serebrennikov 
902d358b2deSVlad Serebrennikov   A &f();
903d358b2deSVlad Serebrennikov   A a3 = f();
904d358b2deSVlad Serebrennikov   // expected-error@-1 {{no matching constructor for initialization of 'A'}}
905d358b2deSVlad Serebrennikov   //   expected-note@#cwg152-A-explicit-ctor {{explicit constructor is not a candidate}}
906d358b2deSVlad Serebrennikov   //   expected-note@#cwg152-A-ctor {{candidate constructor not viable: requires 0 arguments, but 1 was provided}}
907d358b2deSVlad Serebrennikov   A a4(f());
908463e61a0SVlad Serebrennikov } // namespace cwg152
909d358b2deSVlad Serebrennikov 
910d358b2deSVlad Serebrennikov // cwg153: na
911d358b2deSVlad Serebrennikov 
91214ba3f9dSVlad Serebrennikov namespace cwg154 { // cwg154: 2.7
913d358b2deSVlad Serebrennikov   union { int a; };
914d358b2deSVlad Serebrennikov   // expected-error@-1 {{nonymous unions at namespace or global scope must be declared 'static'}}
915d358b2deSVlad Serebrennikov   namespace {
916d358b2deSVlad Serebrennikov     union { int b; };
917d358b2deSVlad Serebrennikov   }
918d358b2deSVlad Serebrennikov   static union { int c; };
919463e61a0SVlad Serebrennikov } // namespace cwg154
920d358b2deSVlad Serebrennikov 
921d358b2deSVlad Serebrennikov namespace cwg155 { // cwg155: dup 632
922d358b2deSVlad Serebrennikov   struct S { int n; } s = { { 1 } };
923d358b2deSVlad Serebrennikov   // expected-warning@-1 {{braces around scalar initializer}}
924463e61a0SVlad Serebrennikov } // namespace cwg155
925d358b2deSVlad Serebrennikov 
92664e8d5b1SVlad Serebrennikov // cwg156: sup 1111
927d358b2deSVlad Serebrennikov // cwg158 is in cwg158.cpp
928d358b2deSVlad Serebrennikov 
929d358b2deSVlad Serebrennikov namespace cwg159 { // cwg159: 3.5
930d358b2deSVlad Serebrennikov   namespace X { void f(); }
931d358b2deSVlad Serebrennikov   void f();
932d358b2deSVlad Serebrennikov   void cwg159::f() {}
933d358b2deSVlad Serebrennikov   // expected-warning@-1 {{extra qualification on member 'f'}}
934d358b2deSVlad Serebrennikov   void cwg159::X::f() {}
935463e61a0SVlad Serebrennikov } // namespace cwg159
936d358b2deSVlad Serebrennikov 
937d358b2deSVlad Serebrennikov // cwg160: na
938d358b2deSVlad Serebrennikov 
939d358b2deSVlad Serebrennikov namespace cwg161 { // cwg161: 3.1
940d358b2deSVlad Serebrennikov   class A {
941d358b2deSVlad Serebrennikov   protected:
942d358b2deSVlad Serebrennikov     struct B { int n; } b; // #cwg161-B
943d358b2deSVlad Serebrennikov     static B bs;
944d358b2deSVlad Serebrennikov     void f(); // #cwg161-f
945d358b2deSVlad Serebrennikov     static void sf();
946d358b2deSVlad Serebrennikov   };
947d358b2deSVlad Serebrennikov   struct C : A {};
948d358b2deSVlad Serebrennikov   struct D : A {
949d358b2deSVlad Serebrennikov     void g(C c) {
950d358b2deSVlad Serebrennikov       (void)b.n;
951d358b2deSVlad Serebrennikov       B b1;
952d358b2deSVlad Serebrennikov       C::B b2; // ok, accessible as a member of A
953d358b2deSVlad Serebrennikov       (void)&C::b;
954d358b2deSVlad Serebrennikov       // expected-error@-1 {{'b' is a protected member of 'cwg161::A'}}
955d358b2deSVlad Serebrennikov       //   expected-note@#cwg161-B {{declared protected here}}
956d358b2deSVlad Serebrennikov       (void)&C::bs;
957d358b2deSVlad Serebrennikov       (void)c.b;
958d358b2deSVlad Serebrennikov       // expected-error@-1 {{'b' is a protected member of 'cwg161::A'}}
959d358b2deSVlad Serebrennikov       //   expected-note@#cwg161-B {{declared protected here}}
960d358b2deSVlad Serebrennikov       (void)c.bs;
961d358b2deSVlad Serebrennikov       f();
962d358b2deSVlad Serebrennikov       sf();
963d358b2deSVlad Serebrennikov       c.f();
964d358b2deSVlad Serebrennikov       // expected-error@-1 {{protected}}
965d358b2deSVlad Serebrennikov       //   expected-note@#cwg161-f {{declared protected here}}
966d358b2deSVlad Serebrennikov       c.sf();
967d358b2deSVlad Serebrennikov       A::f();
968d358b2deSVlad Serebrennikov       D::f();
969d358b2deSVlad Serebrennikov       A::sf();
970d358b2deSVlad Serebrennikov       C::sf();
971d358b2deSVlad Serebrennikov       D::sf();
972d358b2deSVlad Serebrennikov     }
973d358b2deSVlad Serebrennikov   };
974463e61a0SVlad Serebrennikov } // namespace cwg161
975d358b2deSVlad Serebrennikov 
976d0223b9fScor3ntin namespace cwg162 { // cwg162: 19
977d358b2deSVlad Serebrennikov   struct A {
978d358b2deSVlad Serebrennikov     char &f(char);
979d358b2deSVlad Serebrennikov     static int &f(int);
980d358b2deSVlad Serebrennikov 
981d358b2deSVlad Serebrennikov     void g() {
982d358b2deSVlad Serebrennikov       int &a = (&A::f)(0);
983d358b2deSVlad Serebrennikov       char &b = (&A::f)('0');
984d0223b9fScor3ntin       // expected-error@-1 {{non-const lvalue reference to type 'char' cannot bind to a value of unrelated type 'int'}}
985d358b2deSVlad Serebrennikov     }
986d358b2deSVlad Serebrennikov   };
987d358b2deSVlad Serebrennikov 
988d358b2deSVlad Serebrennikov   int &c = (&A::f)(0);
989d358b2deSVlad Serebrennikov   char &d = (&A::f)('0');
990d0223b9fScor3ntin   // expected-error@-1 {{non-const lvalue reference to type 'char' cannot bind to a value of unrelated type 'int'}}
991463e61a0SVlad Serebrennikov } // namespace cwg162
992d358b2deSVlad Serebrennikov 
993d358b2deSVlad Serebrennikov // cwg163: na
994d358b2deSVlad Serebrennikov 
99514ba3f9dSVlad Serebrennikov namespace cwg164 { // cwg164: 2.7
996d358b2deSVlad Serebrennikov   void f(int);
997d358b2deSVlad Serebrennikov   template <class T> int g(T t) { return f(t); }
998d358b2deSVlad Serebrennikov 
999d358b2deSVlad Serebrennikov   enum E { e };
1000d358b2deSVlad Serebrennikov   int f(E);
1001d358b2deSVlad Serebrennikov 
1002d358b2deSVlad Serebrennikov   int k = g(e);
1003463e61a0SVlad Serebrennikov } // namespace cwg164
1004d358b2deSVlad Serebrennikov 
1005d358b2deSVlad Serebrennikov namespace cwg165 { // cwg165: no
1006d358b2deSVlad Serebrennikov   namespace N {
1007d358b2deSVlad Serebrennikov     struct A { friend struct B; };
1008d358b2deSVlad Serebrennikov     void f() { void g(); }
1009d358b2deSVlad Serebrennikov   }
1010d358b2deSVlad Serebrennikov   // FIXME: cwg1477 says this is ok, cwg165 says it's ill-formed
1011d358b2deSVlad Serebrennikov   struct N::B {};
1012d358b2deSVlad Serebrennikov   // FIXME: cwg165 says this is ill-formed, but the argument in cwg1477 says it's ok
1013d358b2deSVlad Serebrennikov   void N::g() {}
1014463e61a0SVlad Serebrennikov } // namespace cwg165
1015d358b2deSVlad Serebrennikov 
1016d358b2deSVlad Serebrennikov namespace cwg166 { // cwg166: 2.9
1017d358b2deSVlad Serebrennikov   namespace A { class X; }
1018d358b2deSVlad Serebrennikov 
1019d358b2deSVlad Serebrennikov   template<typename T> int f(T t) { return t.n; }
1020d358b2deSVlad Serebrennikov   int g(A::X);
1021d358b2deSVlad Serebrennikov   template<typename T> int h(T t) { return t.n; }
1022d358b2deSVlad Serebrennikov   // expected-error@-1 {{'n' is a private member of 'cwg166::A::X'}}
1023d358b2deSVlad Serebrennikov   //   expected-note@#cwg166-h-instantiation {{in instantiation of function template specialization 'cwg166::h<cwg166::A::X>' requested here}}
1024d358b2deSVlad Serebrennikov   //   expected-note@#cwg166-X-n {{implicitly declared private here}}
1025d358b2deSVlad Serebrennikov   int i(A::X);
1026d358b2deSVlad Serebrennikov 
1027d358b2deSVlad Serebrennikov   namespace A {
1028d358b2deSVlad Serebrennikov     class X {
1029d358b2deSVlad Serebrennikov       friend int f<X>(X);
1030d358b2deSVlad Serebrennikov       friend int cwg166::g(X);
1031d358b2deSVlad Serebrennikov       friend int h(X);
1032d358b2deSVlad Serebrennikov       friend int i(X);
1033d358b2deSVlad Serebrennikov       int n; // #cwg166-X-n
1034d358b2deSVlad Serebrennikov     };
1035d358b2deSVlad Serebrennikov 
1036d358b2deSVlad Serebrennikov     int h(X x) { return x.n; }
1037d358b2deSVlad Serebrennikov     int i(X x) { return x.n; }
1038d358b2deSVlad Serebrennikov   }
1039d358b2deSVlad Serebrennikov 
1040d358b2deSVlad Serebrennikov   template int f(A::X);
1041d358b2deSVlad Serebrennikov   int g(A::X x) { return x.n; }
1042d358b2deSVlad Serebrennikov   template int h(A::X); // #cwg166-h-instantiation
1043d358b2deSVlad Serebrennikov   int i(A::X x) { return x.n; }
1044d358b2deSVlad Serebrennikov   // expected-error@-1 {{'n' is a private member of 'cwg166::A::X'}}
1045d358b2deSVlad Serebrennikov   //   expected-note@#cwg166-X-n {{implicitly declared private here}}
1046463e61a0SVlad Serebrennikov } // namespace cwg166
1047d358b2deSVlad Serebrennikov 
1048d358b2deSVlad Serebrennikov // cwg167: sup 1012
1049d358b2deSVlad Serebrennikov 
1050d358b2deSVlad Serebrennikov namespace cwg168 { // cwg168: no
1051d358b2deSVlad Serebrennikov   extern "C" typedef int (*p)();
1052d358b2deSVlad Serebrennikov   extern "C++" typedef int (*q)();
1053d358b2deSVlad Serebrennikov   struct S {
1054d358b2deSVlad Serebrennikov     static int f();
1055d358b2deSVlad Serebrennikov   };
1056d358b2deSVlad Serebrennikov   p a = &S::f; // FIXME: this should fail.
1057d358b2deSVlad Serebrennikov   q b = &S::f;
1058463e61a0SVlad Serebrennikov } // namespace cwg168
1059d358b2deSVlad Serebrennikov 
106014ba3f9dSVlad Serebrennikov namespace cwg169 { // cwg169: 3.4
1061d358b2deSVlad Serebrennikov   template<typename> struct A { int n; };
1062d358b2deSVlad Serebrennikov   struct B {
1063d358b2deSVlad Serebrennikov     template<typename> struct C;
1064d358b2deSVlad Serebrennikov     template<typename> void f();
1065d358b2deSVlad Serebrennikov     template<typename> static int n;
1066d358b2deSVlad Serebrennikov     // cxx98-11-error@-1 {{variable templates are a C++14 extension}}
1067d358b2deSVlad Serebrennikov   };
1068d358b2deSVlad Serebrennikov   struct D : A<int>, B {
1069d358b2deSVlad Serebrennikov     using A<int>::n;
1070d358b2deSVlad Serebrennikov     using B::C<int>;
1071d358b2deSVlad Serebrennikov     // expected-error@-1 {{using declaration cannot refer to a template specialization}}
1072d358b2deSVlad Serebrennikov     using B::f<int>;
1073d358b2deSVlad Serebrennikov     // expected-error@-1 {{using declaration cannot refer to a template specialization}}
1074d358b2deSVlad Serebrennikov     using B::n<int>;
1075d358b2deSVlad Serebrennikov     // expected-error@-1 {{using declaration cannot refer to a template specialization}}
1076d358b2deSVlad Serebrennikov   };
1077463e61a0SVlad Serebrennikov } // namespace cwg169
1078d358b2deSVlad Serebrennikov 
1079*658ec859SVlad Serebrennikov namespace cwg170 { // cwg170: 3.1
1080*658ec859SVlad Serebrennikov #if __cplusplus >= 201103L
1081*658ec859SVlad Serebrennikov struct A {};
1082*658ec859SVlad Serebrennikov struct B : A { int i; };
1083*658ec859SVlad Serebrennikov struct C : A {};
1084*658ec859SVlad Serebrennikov struct D : C {};
1085*658ec859SVlad Serebrennikov 
1086*658ec859SVlad Serebrennikov constexpr int f(int A::*) { return 0; }
1087*658ec859SVlad Serebrennikov constexpr int g(int C::*) { return 0; }
1088*658ec859SVlad Serebrennikov constexpr int h(int D::*) { return 0; }
1089*658ec859SVlad Serebrennikov 
1090*658ec859SVlad Serebrennikov constexpr auto p = static_cast<int A::*>(&B::i);
1091*658ec859SVlad Serebrennikov constexpr auto q = f(p);
1092*658ec859SVlad Serebrennikov constexpr auto r = g(p);
1093*658ec859SVlad Serebrennikov // since-cxx11-error@-1 {{constexpr variable 'r' must be initialized by a constant expression}}
1094*658ec859SVlad Serebrennikov constexpr auto s = h(p);
1095*658ec859SVlad Serebrennikov // since-cxx11-error@-1 {{constexpr variable 's' must be initialized by a constant expression}}
1096*658ec859SVlad Serebrennikov #endif
1097*658ec859SVlad Serebrennikov } // namespace cwg170
1098*658ec859SVlad Serebrennikov 
1099d358b2deSVlad Serebrennikov namespace { // cwg171: 3.4
1100d358b2deSVlad Serebrennikov   int cwg171a;
1101d358b2deSVlad Serebrennikov }
1102d358b2deSVlad Serebrennikov int cwg171b; // #cwg171b-int
1103d358b2deSVlad Serebrennikov namespace cwg171 {
1104d358b2deSVlad Serebrennikov   extern "C" void cwg171a();
1105d358b2deSVlad Serebrennikov   extern "C" void cwg171b();
1106d358b2deSVlad Serebrennikov   // expected-error@-1 {{declaration of 'cwg171b' with C language linkage conflicts with declaration in global scope}}
1107d358b2deSVlad Serebrennikov   //   expected-note@#cwg171b-int {{declared in global scope here}}
1108463e61a0SVlad Serebrennikov } // namespace cwg171
1109d358b2deSVlad Serebrennikov 
111014ba3f9dSVlad Serebrennikov namespace cwg172 { // cwg172: 2.7
1111d358b2deSVlad Serebrennikov   enum { zero };
1112d358b2deSVlad Serebrennikov   static_assert(-1 < zero, "");
1113d358b2deSVlad Serebrennikov 
1114d358b2deSVlad Serebrennikov   enum { x = -1, y = (unsigned int)-1 };
1115d358b2deSVlad Serebrennikov   static_assert(sizeof(x) > sizeof(int), "");
1116d358b2deSVlad Serebrennikov 
1117d358b2deSVlad Serebrennikov   enum { a = (unsigned int)-1 / 2 };
1118d358b2deSVlad Serebrennikov   static_assert(sizeof(a) == sizeof(int), "");
1119d358b2deSVlad Serebrennikov   static_assert(-a < 0, "");
1120d358b2deSVlad Serebrennikov 
1121d358b2deSVlad Serebrennikov   enum { b = (unsigned int)-1 / 2 + 1 };
1122d358b2deSVlad Serebrennikov   static_assert(sizeof(b) == sizeof(unsigned int), "");
1123d358b2deSVlad Serebrennikov   static_assert(-b > 0, "");
1124d358b2deSVlad Serebrennikov 
1125d358b2deSVlad Serebrennikov   enum { c = (unsigned long)-1 / 2 };
1126d358b2deSVlad Serebrennikov   static_assert(sizeof(c) == sizeof(long), "");
1127d358b2deSVlad Serebrennikov   static_assert(-c < 0, "");
1128d358b2deSVlad Serebrennikov 
1129d358b2deSVlad Serebrennikov   enum { d = (unsigned long)-1 / 2 + 1 };
1130d358b2deSVlad Serebrennikov   static_assert(sizeof(d) == sizeof(unsigned long), "");
1131d358b2deSVlad Serebrennikov   static_assert(-d > 0, "");
1132d358b2deSVlad Serebrennikov 
1133d358b2deSVlad Serebrennikov   enum { e = (unsigned long long)-1 / 2 };
1134d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{'long long' is a C++11 extension}}
1135d358b2deSVlad Serebrennikov   static_assert(sizeof(e) == sizeof(long), "");
1136d358b2deSVlad Serebrennikov   static_assert(-e < 0, "");
1137d358b2deSVlad Serebrennikov 
1138d358b2deSVlad Serebrennikov   enum { f = (unsigned long long)-1 / 2 + 1 };
1139d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{'long long' is a C++11 extension}}
1140d358b2deSVlad Serebrennikov   static_assert(sizeof(f) == sizeof(unsigned long), "");
1141d358b2deSVlad Serebrennikov   static_assert(-f > 0, "");
1142463e61a0SVlad Serebrennikov } // namespace cwg172
1143d358b2deSVlad Serebrennikov 
114414ba3f9dSVlad Serebrennikov namespace cwg173 { // cwg173: 2.7
1145d358b2deSVlad Serebrennikov   static_assert('0' + 1 == '1' && '0' + 2 == '2' && '0' + 3 == '3' &&
1146d358b2deSVlad Serebrennikov                 '0' + 4 == '4' && '0' + 5 == '5' && '0' + 6 == '6' &&
1147d358b2deSVlad Serebrennikov                 '0' + 7 == '7' && '0' + 8 == '8' && '0' + 9 == '9', "");
1148463e61a0SVlad Serebrennikov } // namespace cwg173
1149d358b2deSVlad Serebrennikov 
1150d358b2deSVlad Serebrennikov // cwg174: sup 1012
1151d358b2deSVlad Serebrennikov 
1152d358b2deSVlad Serebrennikov namespace cwg175 { // cwg175: 2.8
1153d358b2deSVlad Serebrennikov   struct A {}; // #cwg175-A
1154d358b2deSVlad Serebrennikov   struct B : private A {}; // #cwg175-B
1155d358b2deSVlad Serebrennikov   struct C : B {
1156d358b2deSVlad Serebrennikov     A a;
1157d358b2deSVlad Serebrennikov     // expected-error@-1 {{'A' is a private member of 'cwg175::A'}}
1158d358b2deSVlad Serebrennikov     //   expected-note@#cwg175-B {{constrained by private inheritance here}}
1159d358b2deSVlad Serebrennikov     //   expected-note@#cwg175-A {{member is declared here}}
1160d358b2deSVlad Serebrennikov     cwg175::A b;
1161d358b2deSVlad Serebrennikov   };
1162463e61a0SVlad Serebrennikov } // namespace cwg175
1163d358b2deSVlad Serebrennikov 
1164d358b2deSVlad Serebrennikov namespace cwg176 { // cwg176: 3.1
1165d358b2deSVlad Serebrennikov   template<typename T> class Y;
1166d358b2deSVlad Serebrennikov   template<> class Y<int> {
1167d358b2deSVlad Serebrennikov     void f() {
1168d358b2deSVlad Serebrennikov       typedef Y A; // #cwg176-A-first
1169d358b2deSVlad Serebrennikov       typedef Y<char> A;
1170d358b2deSVlad Serebrennikov       // expected-error@-1 {{typedef redefinition with different types ('Y<char>' vs 'Y<int>')}}
1171d358b2deSVlad Serebrennikov       //   expected-note@#cwg176-A-first {{previous definition is here}}
1172d358b2deSVlad Serebrennikov     }
1173d358b2deSVlad Serebrennikov   };
1174d358b2deSVlad Serebrennikov 
1175d358b2deSVlad Serebrennikov   template<typename T> struct Base {}; // #cwg176-Base
1176d358b2deSVlad Serebrennikov   template<typename T> struct Derived : public Base<T> {
1177d358b2deSVlad Serebrennikov     void f() {
1178d358b2deSVlad Serebrennikov       typedef typename Derived::template Base<T> A;
1179d358b2deSVlad Serebrennikov       typedef typename Derived::Base A;
1180d358b2deSVlad Serebrennikov     }
1181d358b2deSVlad Serebrennikov   };
1182d358b2deSVlad Serebrennikov   template struct Derived<int>;
1183d358b2deSVlad Serebrennikov 
1184d358b2deSVlad Serebrennikov   template<typename T> struct Derived2 : Base<int>, Base<char> {
1185d358b2deSVlad Serebrennikov     typename Derived2::Base b;
1186d358b2deSVlad Serebrennikov     // expected-error@-1 {{member 'Base' found in multiple base classes of different types}}
1187d358b2deSVlad Serebrennikov     //   expected-note@#cwg176-Base {{member type 'cwg176::Base<int>' found by ambiguous name lookup}}
1188d358b2deSVlad Serebrennikov     //   expected-note@#cwg176-Base {{member type 'cwg176::Base<char>' found by ambiguous name lookup}}
1189d358b2deSVlad Serebrennikov     typename Derived2::Base<double> d;
1190d358b2deSVlad Serebrennikov   };
1191d358b2deSVlad Serebrennikov 
1192d358b2deSVlad Serebrennikov   template<typename T> class X { // #cwg176-X
1193d358b2deSVlad Serebrennikov     X *p1;
1194d358b2deSVlad Serebrennikov     X<T> *p2;
1195d358b2deSVlad Serebrennikov     X<int> *p3;
1196d358b2deSVlad Serebrennikov     cwg176::X *p4; // #cwg176-p4
1197d358b2deSVlad Serebrennikov     // cxx98-14-error@#cwg176-p4 {{use of class template 'cwg176::X' requires template arguments}}
1198d358b2deSVlad Serebrennikov     //  cxx98-14-note@#cwg176-X {{template is declared here}}
11999c4a716cSMatheus Izvekov     // since-cxx17-error@#cwg176-p4 {{use of class template 'cwg176::X' requires template arguments; argument deduction not allowed in non-static class member}}
1200d358b2deSVlad Serebrennikov     //  since-cxx17-note@#cwg176-X {{template is declared here}}
1201d358b2deSVlad Serebrennikov   };
1202463e61a0SVlad Serebrennikov } // namespace cwg176
1203d358b2deSVlad Serebrennikov 
120414ba3f9dSVlad Serebrennikov namespace cwg177 { // cwg177: 2.7
1205d358b2deSVlad Serebrennikov   struct B {};
1206d358b2deSVlad Serebrennikov   struct A {
1207d358b2deSVlad Serebrennikov     A(A &); // #cwg177-A-copy-ctor
1208d358b2deSVlad Serebrennikov     A(const B &); // #cwg177-A-ctor-from-B
1209d358b2deSVlad Serebrennikov   };
1210d358b2deSVlad Serebrennikov   B b;
1211d358b2deSVlad Serebrennikov   A a = b;
1212d358b2deSVlad Serebrennikov   // cxx98-14-error@-1 {{no viable constructor copying variable of type 'A'}}
1213d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg177-A-copy-ctor {{candidate constructor not viable: expects an lvalue for 1st argument}}
1214d358b2deSVlad Serebrennikov   //   cxx98-14-note@#cwg177-A-ctor-from-B {{candidate constructor not viable: no known conversion from 'A' to 'const B &' for 1st argument}}
1215d358b2deSVlad Serebrennikov 
1216d358b2deSVlad Serebrennikov   struct C { C(C&); }; // #cwg177-C-copy-ctor
1217d358b2deSVlad Serebrennikov   struct D : C {};
1218d358b2deSVlad Serebrennikov   struct E { operator D(); };
1219d358b2deSVlad Serebrennikov   E e;
1220d358b2deSVlad Serebrennikov   C c = e;
1221d358b2deSVlad Serebrennikov   // expected-error@-1 {{no viable constructor copying variable of type 'D'}}
1222d358b2deSVlad Serebrennikov   //   expected-note@#cwg177-C-copy-ctor {{candidate constructor not viable: expects an lvalue for 1st argument}}
1223463e61a0SVlad Serebrennikov } // namespace cwg177
1224d358b2deSVlad Serebrennikov 
122514ba3f9dSVlad Serebrennikov namespace cwg178 { // cwg178: 3.1
1226d358b2deSVlad Serebrennikov   static_assert(int() == 0, "");
1227d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L
1228d358b2deSVlad Serebrennikov   static_assert(int{} == 0, "");
1229d358b2deSVlad Serebrennikov   struct S { int a, b; };
1230d358b2deSVlad Serebrennikov   static_assert(S{1}.b == 0, "");
1231d358b2deSVlad Serebrennikov   struct T { constexpr T() : n() {} int n; };
1232d358b2deSVlad Serebrennikov   static_assert(T().n == 0, "");
1233d358b2deSVlad Serebrennikov   struct U : S { constexpr U() : S() {} };
1234d358b2deSVlad Serebrennikov   static_assert(U().b == 0, "");
1235d358b2deSVlad Serebrennikov #endif
1236463e61a0SVlad Serebrennikov } // namespace cwg178
1237d358b2deSVlad Serebrennikov 
123814ba3f9dSVlad Serebrennikov namespace cwg179 { // cwg179: 2.7
1239d358b2deSVlad Serebrennikov   void f();
1240d358b2deSVlad Serebrennikov   int n = &f - &f;
1241d358b2deSVlad Serebrennikov   // expected-error@-1 {{arithmetic on pointers to the function type 'void ()'}}
1242463e61a0SVlad Serebrennikov } // namespace cwg179
1243d358b2deSVlad Serebrennikov 
1244d358b2deSVlad Serebrennikov namespace cwg180 { // cwg180: 2.8
1245d358b2deSVlad Serebrennikov   template<typename T> struct X : T, T::some_base {
1246d358b2deSVlad Serebrennikov     X() : T::some_type_that_might_be_T(), T::some_base() {}
1247d358b2deSVlad Serebrennikov     friend class T::some_class;
1248d358b2deSVlad Serebrennikov     void f() {
1249d358b2deSVlad Serebrennikov       enum T::some_enum e;
1250d358b2deSVlad Serebrennikov     }
1251d358b2deSVlad Serebrennikov   };
1252463e61a0SVlad Serebrennikov } // namespace cwg180
1253d358b2deSVlad Serebrennikov 
125414ba3f9dSVlad Serebrennikov namespace cwg181 { // cwg181: 2.7
1255d358b2deSVlad Serebrennikov   namespace X {
1256d358b2deSVlad Serebrennikov     template <template X<class T> > struct A { };
1257d358b2deSVlad Serebrennikov     // expected-error@-1 +{{}}
1258d358b2deSVlad Serebrennikov     template <template X<class T> > void f(A<X>) { }
1259d358b2deSVlad Serebrennikov     // expected-error@-1 +{{}}
1260d358b2deSVlad Serebrennikov   }
1261d358b2deSVlad Serebrennikov 
1262d358b2deSVlad Serebrennikov   namespace Y {
1263d358b2deSVlad Serebrennikov     template <template <class T> class X> struct A { };
1264d358b2deSVlad Serebrennikov     template <template <class T> class X> void f(A<X>) { }
1265d358b2deSVlad Serebrennikov   }
1266463e61a0SVlad Serebrennikov } // namespace cwg181
1267d358b2deSVlad Serebrennikov 
1268d358b2deSVlad Serebrennikov namespace cwg182 { // cwg182: 14
1269d358b2deSVlad Serebrennikov   template <class T> struct C {
1270d358b2deSVlad Serebrennikov     void f();
1271d358b2deSVlad Serebrennikov     void g();
1272d358b2deSVlad Serebrennikov   };
1273d358b2deSVlad Serebrennikov 
1274d358b2deSVlad Serebrennikov   template <class T> void C<T>::f() {}
1275d358b2deSVlad Serebrennikov   template <class T> void C<T>::g() {}
1276d358b2deSVlad Serebrennikov 
1277d358b2deSVlad Serebrennikov   class A {
1278d358b2deSVlad Serebrennikov     class B {};
1279d358b2deSVlad Serebrennikov     void f();
1280d358b2deSVlad Serebrennikov   };
1281d358b2deSVlad Serebrennikov 
1282d358b2deSVlad Serebrennikov   template void C<A::B>::f();
1283d358b2deSVlad Serebrennikov   template <> void C<A::B>::g();
1284d358b2deSVlad Serebrennikov 
1285d358b2deSVlad Serebrennikov   void A::f() {
1286d358b2deSVlad Serebrennikov     C<B> cb;
1287d358b2deSVlad Serebrennikov     cb.f();
1288d358b2deSVlad Serebrennikov   }
1289463e61a0SVlad Serebrennikov } // namespace cwg182
1290d358b2deSVlad Serebrennikov 
1291d358b2deSVlad Serebrennikov namespace cwg183 { // cwg183: sup 382
1292d358b2deSVlad Serebrennikov   template<typename T> struct A {};
1293d358b2deSVlad Serebrennikov   template<typename T> struct B {
1294d358b2deSVlad Serebrennikov     typedef int X;
1295d358b2deSVlad Serebrennikov   };
1296d358b2deSVlad Serebrennikov   template<> struct A<int> {
1297d358b2deSVlad Serebrennikov     typename B<int>::X x;
1298d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{'typename' occurs outside of a template}}
1299d358b2deSVlad Serebrennikov   };
1300463e61a0SVlad Serebrennikov } // namespace cwg183
1301d358b2deSVlad Serebrennikov 
130214ba3f9dSVlad Serebrennikov namespace cwg184 { // cwg184: 2.7
1303d358b2deSVlad Serebrennikov   template<typename T = float> struct B {};
1304d358b2deSVlad Serebrennikov 
1305d358b2deSVlad Serebrennikov   template<template<typename TT = float> class T> struct A {
1306d358b2deSVlad Serebrennikov     void f();
1307d358b2deSVlad Serebrennikov     void g();
1308d358b2deSVlad Serebrennikov   };
1309d358b2deSVlad Serebrennikov 
1310d358b2deSVlad Serebrennikov   template<template<typename TT> class T> void A<T>::f() { // #cwg184-T
1311d358b2deSVlad Serebrennikov     T<> t;
1312d358b2deSVlad Serebrennikov     // expected-error@-1 {{too few template arguments for template template parameter 'T'}}
1313d358b2deSVlad Serebrennikov     //   expected-note@#cwg184-T {{template is declared here}}
1314d358b2deSVlad Serebrennikov   }
1315d358b2deSVlad Serebrennikov 
1316d358b2deSVlad Serebrennikov   template<template<typename TT = char> class T> void A<T>::g() {
1317d358b2deSVlad Serebrennikov     T<> t;
1318d358b2deSVlad Serebrennikov     typedef T<> X;
1319d358b2deSVlad Serebrennikov     typedef T<char> X;
1320d358b2deSVlad Serebrennikov   }
1321d358b2deSVlad Serebrennikov 
1322d358b2deSVlad Serebrennikov   void h() { A<B>().g(); }
1323463e61a0SVlad Serebrennikov } // namespace cwg184
1324d358b2deSVlad Serebrennikov 
1325d358b2deSVlad Serebrennikov // cwg185 is in cwg185.cpp
1326d358b2deSVlad Serebrennikov 
1327d358b2deSVlad Serebrennikov namespace cwg187 { // cwg187: sup 481
1328d358b2deSVlad Serebrennikov   const int Z = 1;
1329d358b2deSVlad Serebrennikov   template<int X = Z, int Z = X> struct A;
1330d358b2deSVlad Serebrennikov   typedef A<> T;
1331d358b2deSVlad Serebrennikov   typedef A<1, 1> T;
1332463e61a0SVlad Serebrennikov } // namespace cwg187
1333d358b2deSVlad Serebrennikov 
133414ba3f9dSVlad Serebrennikov namespace cwg188 { // cwg188: 2.7
1335d358b2deSVlad Serebrennikov   char c[10];
1336d358b2deSVlad Serebrennikov   static_assert(sizeof(0, c) == 10, "");
1337463e61a0SVlad Serebrennikov } // namespace cwg188
1338d358b2deSVlad Serebrennikov 
1339267ab1cfSVlad Serebrennikov namespace cwg190 { // cwg190: 19
1340267ab1cfSVlad Serebrennikov struct A {
1341267ab1cfSVlad Serebrennikov   int a;
1342267ab1cfSVlad Serebrennikov   static double x;
1343267ab1cfSVlad Serebrennikov   int b;
1344267ab1cfSVlad Serebrennikov   void y();
1345267ab1cfSVlad Serebrennikov   int c;
1346267ab1cfSVlad Serebrennikov };
1347267ab1cfSVlad Serebrennikov 
1348267ab1cfSVlad Serebrennikov struct B {
1349267ab1cfSVlad Serebrennikov   int a;
1350267ab1cfSVlad Serebrennikov   void y();
1351267ab1cfSVlad Serebrennikov   int b;
1352267ab1cfSVlad Serebrennikov   static double x;
1353267ab1cfSVlad Serebrennikov   int c;
1354267ab1cfSVlad Serebrennikov };
1355267ab1cfSVlad Serebrennikov 
1356267ab1cfSVlad Serebrennikov static_assert(__is_layout_compatible(A, B), "");
1357267ab1cfSVlad Serebrennikov } // namespace cwg190
1358d358b2deSVlad Serebrennikov 
1359d358b2deSVlad Serebrennikov int cwg191_j;
136014ba3f9dSVlad Serebrennikov namespace cwg191 { // cwg191: 2.7
1361d358b2deSVlad Serebrennikov   namespace example1 {
1362d358b2deSVlad Serebrennikov     struct outer {
1363d358b2deSVlad Serebrennikov       static int i;
1364d358b2deSVlad Serebrennikov       struct inner {
1365d358b2deSVlad Serebrennikov         void f() {
1366d358b2deSVlad Serebrennikov           struct local {
1367d358b2deSVlad Serebrennikov             void g() {
1368d358b2deSVlad Serebrennikov               i = 5;
1369d358b2deSVlad Serebrennikov             }
1370d358b2deSVlad Serebrennikov           };
1371d358b2deSVlad Serebrennikov         }
1372d358b2deSVlad Serebrennikov       };
1373d358b2deSVlad Serebrennikov     };
1374d358b2deSVlad Serebrennikov   }
1375d358b2deSVlad Serebrennikov 
1376d358b2deSVlad Serebrennikov   namespace example2 {
1377d358b2deSVlad Serebrennikov     struct S {
1378d358b2deSVlad Serebrennikov       void f() {
1379d358b2deSVlad Serebrennikov         struct local2 {
1380d358b2deSVlad Serebrennikov           void g() {
1381d358b2deSVlad Serebrennikov             cwg191_j = 5;
1382d358b2deSVlad Serebrennikov           }
1383d358b2deSVlad Serebrennikov         };
1384d358b2deSVlad Serebrennikov       }
1385d358b2deSVlad Serebrennikov     };
1386d358b2deSVlad Serebrennikov   }
1387463e61a0SVlad Serebrennikov } // namespace cwg191
1388d358b2deSVlad Serebrennikov 
1389fbc198c5SVlad Serebrennikov namespace cwg192 { // cwg192: 2.7
1390fbc198c5SVlad Serebrennikov struct S {
1391fbc198c5SVlad Serebrennikov   void f(I i) { }
1392fbc198c5SVlad Serebrennikov   // expected-error@-1 {{unknown type name 'I'}}
1393fbc198c5SVlad Serebrennikov   typedef int I;
1394fbc198c5SVlad Serebrennikov };
1395fbc198c5SVlad Serebrennikov } // namespace cwg192
1396fbc198c5SVlad Serebrennikov 
1397d358b2deSVlad Serebrennikov // cwg193 is in cwg193.cpp
1398d358b2deSVlad Serebrennikov 
139914ba3f9dSVlad Serebrennikov namespace cwg194 { // cwg194: 2.7
1400d358b2deSVlad Serebrennikov   struct A {
1401d358b2deSVlad Serebrennikov     A();
1402d358b2deSVlad Serebrennikov     void A();
1403d358b2deSVlad Serebrennikov     // expected-error@-1 {{constructor cannot have a return type}}
1404d358b2deSVlad Serebrennikov   };
1405d358b2deSVlad Serebrennikov   struct B {
1406d358b2deSVlad Serebrennikov     void B();
1407d358b2deSVlad Serebrennikov     // expected-error@-1 {{constructor cannot have a return type}}
1408d358b2deSVlad Serebrennikov     B();
1409d358b2deSVlad Serebrennikov   };
1410d358b2deSVlad Serebrennikov   struct C {
1411d358b2deSVlad Serebrennikov     inline explicit C(int) {}
1412d358b2deSVlad Serebrennikov   };
1413463e61a0SVlad Serebrennikov } // namespace cwg194
1414d358b2deSVlad Serebrennikov 
141514ba3f9dSVlad Serebrennikov namespace cwg195 { // cwg195: 2.7
1416d358b2deSVlad Serebrennikov   void f();
1417d358b2deSVlad Serebrennikov   int *p = (int*)&f;
1418d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{cast between pointer-to-function and pointer-to-object is an extension}}
1419d358b2deSVlad Serebrennikov   void (*q)() = (void(*)())&p;
1420d358b2deSVlad Serebrennikov   // cxx98-error@-1 {{cast between pointer-to-function and pointer-to-object is an extension}}
1421463e61a0SVlad Serebrennikov } // namespace cwg195
1422d358b2deSVlad Serebrennikov 
142314ba3f9dSVlad Serebrennikov namespace cwg197 { // cwg197: 2.7
1424d358b2deSVlad Serebrennikov   char &f(char);
1425d358b2deSVlad Serebrennikov 
1426d358b2deSVlad Serebrennikov   template <class T> void g(T t) {
1427d358b2deSVlad Serebrennikov     char &a = f(1);
1428d358b2deSVlad Serebrennikov     char &b = f(T(1));
1429d358b2deSVlad Serebrennikov     // expected-error@-1 {{non-const lvalue reference to type 'char' cannot bind to a value of unrelated type 'int'}}
1430d358b2deSVlad Serebrennikov     //   expected-note@#cwg197-g-e-call {{in instantiation of function template specialization 'cwg197::g<cwg197::E>' requested here}}
1431d358b2deSVlad Serebrennikov     char &c = f(t);
1432d358b2deSVlad Serebrennikov     // expected-error@-1 {{non-const lvalue reference to type 'char' cannot bind to a value of unrelated type 'int'}}
1433d358b2deSVlad Serebrennikov   }
1434d358b2deSVlad Serebrennikov 
1435d358b2deSVlad Serebrennikov   void f(int);
1436d358b2deSVlad Serebrennikov 
1437d358b2deSVlad Serebrennikov   enum E { e };
1438d358b2deSVlad Serebrennikov   int &f(E);
1439d358b2deSVlad Serebrennikov 
1440d358b2deSVlad Serebrennikov   void h() {
1441d358b2deSVlad Serebrennikov     g('a');
1442d358b2deSVlad Serebrennikov     g(2);
1443d358b2deSVlad Serebrennikov     g(e); // #cwg197-g-e-call
1444d358b2deSVlad Serebrennikov   }
1445463e61a0SVlad Serebrennikov } // namespace cwg197
1446d358b2deSVlad Serebrennikov 
144714ba3f9dSVlad Serebrennikov namespace cwg198 { // cwg198: 2.9
1448d358b2deSVlad Serebrennikov   struct A {
1449d358b2deSVlad Serebrennikov     int n;
1450d358b2deSVlad Serebrennikov     struct B {
1451d358b2deSVlad Serebrennikov       int m[sizeof(n)];
1452d358b2deSVlad Serebrennikov       // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
1453d358b2deSVlad Serebrennikov       int f() { return n; }
1454d358b2deSVlad Serebrennikov       // expected-error@-1 {{use of non-static data member 'n' of 'A' from nested type 'B'}}
1455d358b2deSVlad Serebrennikov     };
1456d358b2deSVlad Serebrennikov     struct C;
1457d358b2deSVlad Serebrennikov     struct D;
1458d358b2deSVlad Serebrennikov   };
1459d358b2deSVlad Serebrennikov   struct A::C {
1460d358b2deSVlad Serebrennikov     int m[sizeof(n)];
1461d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
1462d358b2deSVlad Serebrennikov     int f() { return n; }
1463d358b2deSVlad Serebrennikov     // expected-error@-1 {{use of non-static data member 'n' of 'A' from nested type 'C'}}
1464d358b2deSVlad Serebrennikov   };
1465d358b2deSVlad Serebrennikov   struct A::D : A {
1466d358b2deSVlad Serebrennikov     int m[sizeof(n)];
1467d358b2deSVlad Serebrennikov     // cxx98-error@-1 {{invalid use of non-static data member 'n'}}
1468d358b2deSVlad Serebrennikov     int f() { return n; }
1469d358b2deSVlad Serebrennikov   };
1470463e61a0SVlad Serebrennikov } // namespace cwg198
1471d358b2deSVlad Serebrennikov 
1472d358b2deSVlad Serebrennikov // cwg199 is in cwg199.cpp
1473