13c5f2698SVlad Serebrennikov // RUN: %clang_cc1 -std=c++98 %s -verify=expected,cxx98,cxx98-14 -fexceptions -fcxx-exceptions -pedantic-errors 2d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++11 %s -verify=expected,since-cxx11,cxx98-14,cxx11-14 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 3d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++14 %s -verify=expected,since-cxx11,cxx98-14,cxx11-14 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 4d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++17 %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 5d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++20 %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 6d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++23 %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 7327e2b7cSVlad Serebrennikov // RUN: %clang_cc1 -std=c++2c %s -verify=expected,since-cxx11,since-cxx17 -fexceptions -fcxx-exceptions -pedantic-errors -triple %itanium_abi_triple 8d358b2deSVlad Serebrennikov 9d358b2deSVlad Serebrennikov #if __cplusplus == 199711L 10d358b2deSVlad Serebrennikov #define static_assert(...) __extension__ _Static_assert(__VA_ARGS__) 11d358b2deSVlad Serebrennikov // cxx98-error@-1 {{variadic macros are a C99 feature}} 12d358b2deSVlad Serebrennikov #endif 13d358b2deSVlad Serebrennikov 14d358b2deSVlad Serebrennikov namespace cwg1 { // cwg1: no 15d358b2deSVlad Serebrennikov namespace X { extern "C" void cwg1_f(int a = 1); } 16d358b2deSVlad Serebrennikov namespace Y { extern "C" void cwg1_f(int a = 1); } 17d358b2deSVlad Serebrennikov using X::cwg1_f; using Y::cwg1_f; 18d358b2deSVlad Serebrennikov void g() { 19d358b2deSVlad Serebrennikov cwg1_f(0); 20d358b2deSVlad Serebrennikov // FIXME: This should be rejected, due to the ambiguous default argument. 21d358b2deSVlad Serebrennikov cwg1_f(); 22d358b2deSVlad Serebrennikov } 23d358b2deSVlad Serebrennikov namespace X { 24d358b2deSVlad Serebrennikov using Y::cwg1_f; 25d358b2deSVlad Serebrennikov void h() { 26d358b2deSVlad Serebrennikov cwg1_f(0); 27d358b2deSVlad Serebrennikov // FIXME: This should be rejected, due to the ambiguous default argument. 28d358b2deSVlad Serebrennikov cwg1_f(); 29d358b2deSVlad Serebrennikov } 30d358b2deSVlad Serebrennikov } 31d358b2deSVlad Serebrennikov 32d358b2deSVlad Serebrennikov namespace X { 33d358b2deSVlad Serebrennikov void z(int); 34d358b2deSVlad Serebrennikov } 35d358b2deSVlad Serebrennikov void X::z(int = 1) {} // #cwg1-z 36d358b2deSVlad Serebrennikov namespace X { 37d358b2deSVlad Serebrennikov void z(int = 1); 38d358b2deSVlad Serebrennikov // expected-error@-1 {{redefinition of default argument}} 39d358b2deSVlad Serebrennikov // expected-note@#cwg1-z {{previous definition is here}} 40d358b2deSVlad Serebrennikov } 41d358b2deSVlad Serebrennikov 42d358b2deSVlad Serebrennikov void i(int = 1); 43d358b2deSVlad Serebrennikov void j() { 44d358b2deSVlad Serebrennikov void i(int = 1); 45d358b2deSVlad Serebrennikov using cwg1::i; 46d358b2deSVlad Serebrennikov i(0); 47d358b2deSVlad Serebrennikov // FIXME: This should be rejected, due to the ambiguous default argument. 48d358b2deSVlad Serebrennikov i(); 49d358b2deSVlad Serebrennikov } 50d358b2deSVlad Serebrennikov void k() { 51d358b2deSVlad Serebrennikov using cwg1::i; 52d358b2deSVlad Serebrennikov void i(int = 1); 53d358b2deSVlad Serebrennikov i(0); 54d358b2deSVlad Serebrennikov // FIXME: This should be rejected, due to the ambiguous default argument. 55d358b2deSVlad Serebrennikov i(); 56d358b2deSVlad Serebrennikov } 57463e61a0SVlad Serebrennikov } // namespace cwg1 58d358b2deSVlad Serebrennikov 5914ba3f9dSVlad Serebrennikov namespace cwg3 { // cwg3: 2.7 60d358b2deSVlad Serebrennikov template<typename T> struct A {}; 61d358b2deSVlad Serebrennikov template<typename T> void f(T) { A<T> a; } // #cwg3-f-T 62d358b2deSVlad Serebrennikov template void f(int); 63d358b2deSVlad Serebrennikov template<> struct A<int> {}; 64d358b2deSVlad Serebrennikov // expected-error@-1 {{explicit specialization of 'cwg3::A<int>' after instantiation}} 65d358b2deSVlad Serebrennikov // expected-note@#cwg3-f-T {{implicit instantiation first required here}} 66463e61a0SVlad Serebrennikov } // namespace cwg3 67d358b2deSVlad Serebrennikov 68d358b2deSVlad Serebrennikov namespace cwg4 { // cwg4: 2.8 69d358b2deSVlad Serebrennikov extern "C" { 70d358b2deSVlad Serebrennikov static void cwg4_f(int) {} 71d358b2deSVlad Serebrennikov static void cwg4_f(float) {} 72d358b2deSVlad Serebrennikov void cwg4_g(int) {} // #cwg4-g-int 73d358b2deSVlad Serebrennikov void cwg4_g(float) {} 74d358b2deSVlad Serebrennikov // expected-error@-1 {{conflicting types for 'cwg4_g'}} 75d358b2deSVlad Serebrennikov // expected-note@#cwg4-g-int {{previous definition is here}} 76d358b2deSVlad Serebrennikov } 77463e61a0SVlad Serebrennikov } // namespace cwg4 78d358b2deSVlad Serebrennikov 79d358b2deSVlad Serebrennikov namespace cwg5 { // cwg5: 3.1 80d358b2deSVlad Serebrennikov struct A {} a; 81d358b2deSVlad Serebrennikov struct B { 82d358b2deSVlad Serebrennikov B(const A&); 83d358b2deSVlad Serebrennikov B(const B&); 84d358b2deSVlad Serebrennikov }; 85d358b2deSVlad Serebrennikov const volatile B b = a; 86d358b2deSVlad Serebrennikov 87d358b2deSVlad Serebrennikov struct C { C(C&); }; 88d358b2deSVlad Serebrennikov struct D : C {}; 89d358b2deSVlad Serebrennikov struct E { operator D&(); } e; 90d358b2deSVlad Serebrennikov const C c = e; 91463e61a0SVlad Serebrennikov } // namespace cwg5 92d358b2deSVlad Serebrennikov 93d358b2deSVlad Serebrennikov namespace cwg7 { // cwg7: 3.4 94d358b2deSVlad Serebrennikov class A { public: ~A(); }; 95d358b2deSVlad Serebrennikov class B : virtual private A {}; // #cwg7-B 96d358b2deSVlad Serebrennikov class C : public B {} c; // #cwg7-C 97d358b2deSVlad Serebrennikov // expected-error@#cwg7-C {{inherited virtual base class 'A' has private destructor}} 98d358b2deSVlad Serebrennikov // expected-note@#cwg7-C {{in implicit default constructor for 'cwg7::C' first required here}} 99d358b2deSVlad Serebrennikov // expected-note@#cwg7-B {{declared private here}} 100d358b2deSVlad Serebrennikov // expected-error@#cwg7-C {{inherited virtual base class 'A' has private destructor}} 101d358b2deSVlad Serebrennikov // expected-note@#cwg7-C {{in implicit destructor for 'cwg7::C' first required here}} 102d358b2deSVlad Serebrennikov // expected-note@#cwg7-B {{declared private here}} 103d358b2deSVlad Serebrennikov class VeryDerivedC : public B, virtual public A {} vdc; 104d358b2deSVlad Serebrennikov 105d358b2deSVlad Serebrennikov class X { ~X(); }; // #cwg7-X 106d358b2deSVlad Serebrennikov class Y : X { ~Y() {} }; 107d358b2deSVlad Serebrennikov // expected-error@-1 {{base class 'X' has private destructor}} 108d358b2deSVlad Serebrennikov // expected-note@#cwg7-X {{implicitly declared private here}} 109d358b2deSVlad Serebrennikov 110d358b2deSVlad Serebrennikov namespace PR16370 { // This regressed the first time CWG7 was fixed. 111d358b2deSVlad Serebrennikov struct S1 { virtual ~S1(); }; 112d358b2deSVlad Serebrennikov struct S2 : S1 {}; 113d358b2deSVlad Serebrennikov struct S3 : S2 {}; 114d358b2deSVlad Serebrennikov struct S4 : virtual S2 {}; 115d358b2deSVlad Serebrennikov struct S5 : S3, S4 { 116d358b2deSVlad Serebrennikov S5(); 117d358b2deSVlad Serebrennikov ~S5(); 118d358b2deSVlad Serebrennikov }; 119d358b2deSVlad Serebrennikov S5::S5() {} 120d358b2deSVlad Serebrennikov } 121463e61a0SVlad Serebrennikov } // namespace cwg7 122d358b2deSVlad Serebrennikov 123d358b2deSVlad Serebrennikov namespace cwg8 { // cwg8: dup 45 124d358b2deSVlad Serebrennikov class A { 125d358b2deSVlad Serebrennikov struct U; 126d358b2deSVlad Serebrennikov static const int k = 5; 127d358b2deSVlad Serebrennikov void f(); 128d358b2deSVlad Serebrennikov template<typename, int, void (A::*)()> struct T; 129d358b2deSVlad Serebrennikov 130d358b2deSVlad Serebrennikov T<U, k, &A::f> *g(); 131d358b2deSVlad Serebrennikov }; 132d358b2deSVlad Serebrennikov A::T<A::U, A::k, &A::f> *A::g() { return 0; } 133463e61a0SVlad Serebrennikov } // namespace cwg8 134d358b2deSVlad Serebrennikov 135d358b2deSVlad Serebrennikov namespace cwg9 { // cwg9: 2.8 136d358b2deSVlad Serebrennikov struct B { 137d358b2deSVlad Serebrennikov protected: 138d358b2deSVlad Serebrennikov int m; // #cwg9-m 139d358b2deSVlad Serebrennikov friend int R1(); 140d358b2deSVlad Serebrennikov }; 141d358b2deSVlad Serebrennikov struct N : protected B { // #cwg9-N 142d358b2deSVlad Serebrennikov friend int R2(); 143d358b2deSVlad Serebrennikov } n; 144d358b2deSVlad Serebrennikov int R1() { return n.m; } 145d358b2deSVlad Serebrennikov // expected-error@-1 {{'m' is a protected member of 'cwg9::B'}} 146d358b2deSVlad Serebrennikov // expected-note@#cwg9-N {{constrained by protected inheritance here}} 147d358b2deSVlad Serebrennikov // expected-note@#cwg9-m {{member is declared here}} 148d358b2deSVlad Serebrennikov int R2() { return n.m; } 149463e61a0SVlad Serebrennikov } // namespace cwg9 150d358b2deSVlad Serebrennikov 151d358b2deSVlad Serebrennikov namespace cwg10 { // cwg10: dup 45 152d358b2deSVlad Serebrennikov class A { 153d358b2deSVlad Serebrennikov struct B { 154d358b2deSVlad Serebrennikov A::B *p; 155d358b2deSVlad Serebrennikov }; 156d358b2deSVlad Serebrennikov }; 157463e61a0SVlad Serebrennikov } // namespace cwg10 158d358b2deSVlad Serebrennikov 15914ba3f9dSVlad Serebrennikov namespace cwg11 { // cwg11: 2.7 160d358b2deSVlad Serebrennikov template<typename T> struct A : T { 161d358b2deSVlad Serebrennikov using typename T::U; 162d358b2deSVlad Serebrennikov U u; 163d358b2deSVlad Serebrennikov }; 164d358b2deSVlad Serebrennikov template<typename T> struct B : T { 165d358b2deSVlad Serebrennikov using T::V; 166d358b2deSVlad Serebrennikov V v; 167d358b2deSVlad Serebrennikov // expected-error@-1 {{unknown type name 'V'}} 168d358b2deSVlad Serebrennikov }; 169d358b2deSVlad Serebrennikov struct X { typedef int U; }; 170d358b2deSVlad Serebrennikov A<X> ax; 171463e61a0SVlad Serebrennikov } // namespace cwg11 172d358b2deSVlad Serebrennikov 173d358b2deSVlad Serebrennikov namespace cwg12 { // cwg12: sup 239 174d358b2deSVlad Serebrennikov enum E { e }; 175d358b2deSVlad Serebrennikov E &f(E, E = e); 176d358b2deSVlad Serebrennikov void g() { 177d358b2deSVlad Serebrennikov int &f(int, E = e); 178d358b2deSVlad Serebrennikov // Under CWG12, these call two different functions. 179d358b2deSVlad Serebrennikov // Under CWG239, they call the same function. 180d358b2deSVlad Serebrennikov int &b = f(e); 181d358b2deSVlad Serebrennikov int &c = f(1); 182d358b2deSVlad Serebrennikov } 183463e61a0SVlad Serebrennikov } // namespace cwg12 184d358b2deSVlad Serebrennikov 185d358b2deSVlad Serebrennikov namespace cwg13 { // cwg13: no 186d358b2deSVlad Serebrennikov extern "C" void f(int); 187d358b2deSVlad Serebrennikov void g(char); 188d358b2deSVlad Serebrennikov 189d358b2deSVlad Serebrennikov template<typename T> struct A { 190d358b2deSVlad Serebrennikov A(void (*fp)(T)); 191d358b2deSVlad Serebrennikov }; 192d358b2deSVlad Serebrennikov template<typename T> int h(void (T)); 193d358b2deSVlad Serebrennikov 194d358b2deSVlad Serebrennikov A<int> a1(f); // FIXME: We should reject this. 195d358b2deSVlad Serebrennikov A<char> a2(g); 196d358b2deSVlad Serebrennikov int a3 = h(f); // FIXME: We should reject this. 197d358b2deSVlad Serebrennikov int a4 = h(g); 198463e61a0SVlad Serebrennikov } // namespace cwg13 199d358b2deSVlad Serebrennikov 200d358b2deSVlad Serebrennikov namespace cwg14 { // cwg14: 3.4 201d358b2deSVlad Serebrennikov namespace X { extern "C" int cwg14_f(); } 202d358b2deSVlad Serebrennikov namespace Y { extern "C" int cwg14_f(); } 203d358b2deSVlad Serebrennikov using namespace X; 204d358b2deSVlad Serebrennikov using namespace Y; 205d358b2deSVlad Serebrennikov int k = cwg14_f(); 206d358b2deSVlad Serebrennikov 207d358b2deSVlad Serebrennikov class C { 208d358b2deSVlad Serebrennikov int k; 209d358b2deSVlad Serebrennikov friend int Y::cwg14_f(); 210d358b2deSVlad Serebrennikov } c; 211d358b2deSVlad Serebrennikov namespace Z { 212d358b2deSVlad Serebrennikov extern "C" int cwg14_f() { return c.k; } 213d358b2deSVlad Serebrennikov } 214d358b2deSVlad Serebrennikov 215d358b2deSVlad Serebrennikov namespace X { typedef int T; typedef int U; } // #cwg14-X-U 216d358b2deSVlad Serebrennikov namespace Y { typedef int T; typedef long U; } // #cwg14-Y-U 217d358b2deSVlad Serebrennikov T t; // ok, same type both times 218d358b2deSVlad Serebrennikov U u; 219d358b2deSVlad Serebrennikov // expected-error@-1 {{reference to 'U' is ambiguous}} 220d358b2deSVlad Serebrennikov // expected-note@#cwg14-X-U {{candidate found by name lookup is 'cwg14::X::U'}} 221d358b2deSVlad Serebrennikov // expected-note@#cwg14-Y-U {{candidate found by name lookup is 'cwg14::Y::U'}} 222463e61a0SVlad Serebrennikov } // namespace cwg14 223d358b2deSVlad Serebrennikov 22414ba3f9dSVlad Serebrennikov namespace cwg15 { // cwg15: 2.7 225d358b2deSVlad Serebrennikov template<typename T> void f(int); // #cwg15-f-decl-first 226d358b2deSVlad Serebrennikov template<typename T> void f(int = 0); 227d358b2deSVlad Serebrennikov // expected-error@-1 {{default arguments cannot be added to a function template that has already been declared}} 228d358b2deSVlad Serebrennikov // expected-note@#cwg15-f-decl-first {{previous template declaration is here}} 229463e61a0SVlad Serebrennikov } // namespace cwg15 230d358b2deSVlad Serebrennikov 231d358b2deSVlad Serebrennikov namespace cwg16 { // cwg16: 2.8 232d358b2deSVlad Serebrennikov class A { // #cwg16-A 233d358b2deSVlad Serebrennikov void f(); // #cwg16-A-f-decl 234d358b2deSVlad Serebrennikov friend class C; 235d358b2deSVlad Serebrennikov }; 236d358b2deSVlad Serebrennikov class B : A {}; // #cwg16-B 237d358b2deSVlad Serebrennikov class C : B { 238d358b2deSVlad Serebrennikov void g() { 239d358b2deSVlad Serebrennikov f(); 240d358b2deSVlad Serebrennikov // expected-error@-1 {{'f' is a private member of 'cwg16::A'}} 241d358b2deSVlad Serebrennikov // expected-note@#cwg16-B {{constrained by implicitly private inheritance here}} 242d358b2deSVlad Serebrennikov // expected-note@#cwg16-A-f-decl {{member is declared here}} 243d358b2deSVlad Serebrennikov A::f(); // #cwg16-A-f-call 244d358b2deSVlad Serebrennikov // expected-error@#cwg16-A-f-call {{'A' is a private member of 'cwg16::A'}} 245d358b2deSVlad Serebrennikov // expected-note@#cwg16-B {{constrained by implicitly private inheritance here}} 246d358b2deSVlad Serebrennikov // expected-note@#cwg16-A {{member is declared here}} 247d358b2deSVlad Serebrennikov // expected-error@#cwg16-A-f-call {{cannot cast 'cwg16::C' to its private base class 'cwg16::A'}} 248d358b2deSVlad Serebrennikov // expected-note@#cwg16-B {{implicitly declared private here}} 249d358b2deSVlad Serebrennikov } 250d358b2deSVlad Serebrennikov }; 251463e61a0SVlad Serebrennikov } // namespace cwg16 252d358b2deSVlad Serebrennikov 25314ba3f9dSVlad Serebrennikov namespace cwg17 { // cwg17: 2.7 254d358b2deSVlad Serebrennikov class A { 255d358b2deSVlad Serebrennikov int n; 256d358b2deSVlad Serebrennikov int f(); 257d358b2deSVlad Serebrennikov struct C; 258d358b2deSVlad Serebrennikov }; 259d358b2deSVlad Serebrennikov struct B : A {} b; 260d358b2deSVlad Serebrennikov int A::f() { return b.n; } 261d358b2deSVlad Serebrennikov struct A::C : A { 262d358b2deSVlad Serebrennikov int g() { return n; } 263d358b2deSVlad Serebrennikov }; 264463e61a0SVlad Serebrennikov } // namespace cwg17 265d358b2deSVlad Serebrennikov 266d358b2deSVlad Serebrennikov // cwg18: sup 577 267d358b2deSVlad Serebrennikov 268d358b2deSVlad Serebrennikov namespace cwg19 { // cwg19: 3.1 269d358b2deSVlad Serebrennikov struct A { 270d358b2deSVlad Serebrennikov int n; // #cwg19-n 271d358b2deSVlad Serebrennikov }; 272d358b2deSVlad Serebrennikov struct B : protected A { // #cwg19-B 273d358b2deSVlad Serebrennikov }; 274d358b2deSVlad Serebrennikov struct C : B {} c; 275d358b2deSVlad Serebrennikov struct D : B { 276d358b2deSVlad Serebrennikov int get1() { return c.n; } 277d358b2deSVlad Serebrennikov // expected-error@-1 {{'n' is a protected member of 'cwg19::A'}} 278d358b2deSVlad Serebrennikov // expected-note@#cwg19-B {{constrained by protected inheritance here}} 279d358b2deSVlad Serebrennikov // expected-note@#cwg19-n {{member is declared here}} 280d358b2deSVlad Serebrennikov int get2() { return ((A&)c).n; } // ok, A is an accessible base of B from here 281d358b2deSVlad Serebrennikov }; 282463e61a0SVlad Serebrennikov } // namespace cwg19 283d358b2deSVlad Serebrennikov 284d358b2deSVlad Serebrennikov namespace cwg20 { // cwg20: 2.8 285d358b2deSVlad Serebrennikov class X { 286d358b2deSVlad Serebrennikov public: 287d358b2deSVlad Serebrennikov X(); 288d358b2deSVlad Serebrennikov private: 289d358b2deSVlad Serebrennikov X(const X&); // #cwg20-X-ctor 290d358b2deSVlad Serebrennikov }; 291d358b2deSVlad Serebrennikov X &f(); 292d358b2deSVlad Serebrennikov X x = f(); 293d358b2deSVlad Serebrennikov // expected-error@-1 {{calling a private constructor of class 'cwg20::X'}} 294d358b2deSVlad Serebrennikov // expected-note@#cwg20-X-ctor {{declared private here}} 295463e61a0SVlad Serebrennikov } // namespace cwg20 296d358b2deSVlad Serebrennikov 297d358b2deSVlad Serebrennikov namespace cwg21 { // cwg21: 3.4 298d358b2deSVlad Serebrennikov template<typename T> struct A; 299d358b2deSVlad Serebrennikov struct X { 300d358b2deSVlad Serebrennikov template<typename T = int> friend struct A; 301d358b2deSVlad Serebrennikov // expected-error@-1 {{default template argument not permitted on a friend template}} 302d358b2deSVlad Serebrennikov template<typename T = int> friend struct B; 303d358b2deSVlad Serebrennikov // expected-error@-1 {{default template argument not permitted on a friend template}} 304d358b2deSVlad Serebrennikov }; 305463e61a0SVlad Serebrennikov } // namespace cwg21 306d358b2deSVlad Serebrennikov 307d358b2deSVlad Serebrennikov namespace cwg22 { // cwg22: sup 481 308d358b2deSVlad Serebrennikov template<typename cwg22_T = cwg22_T> struct X; 309d358b2deSVlad Serebrennikov // expected-error@-1 {{unknown type name 'cwg22_T'}} 310d358b2deSVlad Serebrennikov typedef int T; 311d358b2deSVlad Serebrennikov template<typename T = T> struct Y; 312463e61a0SVlad Serebrennikov } // namespace cwg22 313d358b2deSVlad Serebrennikov 31414ba3f9dSVlad Serebrennikov namespace cwg23 { // cwg23: 2.7 315d358b2deSVlad Serebrennikov template<typename T> void f(T, T); // #cwg23-f-T-T 316d358b2deSVlad Serebrennikov template<typename T> void f(T, int); // #cwg23-f-T-int 317d358b2deSVlad Serebrennikov void g() { f(0, 0); } 318d358b2deSVlad Serebrennikov // expected-error@-1 {{call to 'f' is ambiguous}} 319d358b2deSVlad Serebrennikov // expected-note@#cwg23-f-T-T {{candidate function [with T = int]}} 320d358b2deSVlad Serebrennikov // expected-note@#cwg23-f-T-int {{candidate function [with T = int]}} 321463e61a0SVlad Serebrennikov } // namespace cwg23 322d358b2deSVlad Serebrennikov 323d358b2deSVlad Serebrennikov // cwg24: na 324d358b2deSVlad Serebrennikov 32514ba3f9dSVlad Serebrennikov namespace cwg25 { // cwg25: 4 326d358b2deSVlad Serebrennikov struct A { 327d358b2deSVlad Serebrennikov void f() throw(int); 328d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 329d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 330d358b2deSVlad Serebrennikov }; 331d358b2deSVlad Serebrennikov void (A::*f)() throw (int); 332d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 333d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 334d358b2deSVlad Serebrennikov void (A::*g)() throw () = f; 335d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{target exception specification is not superset of source}} 336d358b2deSVlad Serebrennikov // since-cxx17-error@-2 {{different exception specifications}} 337d358b2deSVlad Serebrennikov void (A::*g2)() throw () = 0; 338d358b2deSVlad Serebrennikov void (A::*h)() throw (int, char) = f; 339d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 340d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 341d358b2deSVlad Serebrennikov void (A::*i)() throw () = &A::f; 342d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{target exception specification is not superset of source}} 343d358b2deSVlad Serebrennikov // since-cxx17-error@-2 {{different exception specifications}} 344d358b2deSVlad Serebrennikov void (A::*i2)() throw () = 0; 345d358b2deSVlad Serebrennikov void (A::*j)() throw (int, char) = &A::f; 346d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 347d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 348d358b2deSVlad Serebrennikov void x() { 349d358b2deSVlad Serebrennikov g2 = f; 350d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{target exception specification is not superset of source}} 351d358b2deSVlad Serebrennikov // since-cxx17-error@-2 {{different exception specifications}} 352d358b2deSVlad Serebrennikov h = f; 353d358b2deSVlad Serebrennikov i2 = &A::f; 354d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{target exception specification is not superset of source}} 355d358b2deSVlad Serebrennikov // since-cxx17-error@-2 {{different exception specifications}} 356d358b2deSVlad Serebrennikov j = &A::f; 357d358b2deSVlad Serebrennikov } 358463e61a0SVlad Serebrennikov } // namespace cwg25 359d358b2deSVlad Serebrennikov 36014ba3f9dSVlad Serebrennikov namespace cwg26 { // cwg26: 2.7 361d358b2deSVlad Serebrennikov struct A { A(A, const A & = A()); }; 362d358b2deSVlad Serebrennikov // expected-error@-1 {{copy constructor must pass its first argument by reference}} 363d358b2deSVlad Serebrennikov struct B { 364d358b2deSVlad Serebrennikov B(); 365d358b2deSVlad Serebrennikov // FIXME: In C++98, we diagnose this twice. 366d358b2deSVlad Serebrennikov B(const B &, B = B()); 367d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{recursive evaluation of default argument}} 368d358b2deSVlad Serebrennikov // cxx98-14-note@-2 {{default argument used here}} 369d358b2deSVlad Serebrennikov // cxx98-error@-3 {{recursive evaluation of default argument}} 370d358b2deSVlad Serebrennikov // cxx98-note@-4 {{default argument used here}} 371d358b2deSVlad Serebrennikov }; 372d358b2deSVlad Serebrennikov struct C { 373d358b2deSVlad Serebrennikov static C &f(); 374d358b2deSVlad Serebrennikov C(const C &, C = f()); 375d358b2deSVlad Serebrennikov // expected-error@-1 {{recursive evaluation of default argument}} 376d358b2deSVlad Serebrennikov // expected-note@-2 {{default argument used here}} 377d358b2deSVlad Serebrennikov }; 378463e61a0SVlad Serebrennikov } // namespace cwg26 379d358b2deSVlad Serebrennikov 38014ba3f9dSVlad Serebrennikov namespace cwg27 { // cwg27: 2.7 381d358b2deSVlad Serebrennikov enum E { e } n; 382d358b2deSVlad Serebrennikov E &m = true ? n : n; 383463e61a0SVlad Serebrennikov } // namespace cwg27 384d358b2deSVlad Serebrennikov 385d358b2deSVlad Serebrennikov // cwg28: na lib 386d358b2deSVlad Serebrennikov 387d358b2deSVlad Serebrennikov namespace cwg29 { // cwg29: 3.4 388d358b2deSVlad Serebrennikov void cwg29_f0(); // #cwg29-f0 389d358b2deSVlad Serebrennikov void g0() { void cwg29_f0(); } 390d358b2deSVlad Serebrennikov extern "C++" void g0_cxx() { void cwg29_f0(); } 391d358b2deSVlad Serebrennikov extern "C" void g0_c() { void cwg29_f0(); } 392d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'cwg29_f0' has a different language linkage}} 393d358b2deSVlad Serebrennikov // expected-note@#cwg29-f0 {{previous declaration is here}} 394d358b2deSVlad Serebrennikov 395d358b2deSVlad Serebrennikov extern "C" void cwg29_f1(); // #cwg29-f1 396d358b2deSVlad Serebrennikov void g1() { void cwg29_f1(); } 397d358b2deSVlad Serebrennikov extern "C" void g1_c() { void cwg29_f1(); } 398d358b2deSVlad Serebrennikov extern "C++" void g1_cxx() { void cwg29_f1(); } 399d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'cwg29_f1' has a different language linkage}} 400d358b2deSVlad Serebrennikov // expected-note@#cwg29-f1 {{previous declaration is here}} 401d358b2deSVlad Serebrennikov 402d358b2deSVlad Serebrennikov void g2() { void cwg29_f2(); } // #cwg29-f2 403d358b2deSVlad Serebrennikov extern "C" void cwg29_f2(); 404d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'cwg29_f2' has a different language linkage}} 405d358b2deSVlad Serebrennikov // expected-note@#cwg29-f2 {{previous declaration is here}} 406d358b2deSVlad Serebrennikov 407d358b2deSVlad Serebrennikov extern "C" void g3() { void cwg29_f3(); } // #cwg29-f3 408d358b2deSVlad Serebrennikov extern "C++" void cwg29_f3(); 409d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'cwg29_f3' has a different language linkage}} 410d358b2deSVlad Serebrennikov // expected-note@#cwg29-f3 {{previous declaration is here}} 411d358b2deSVlad Serebrennikov 412d358b2deSVlad Serebrennikov extern "C++" void g4() { void cwg29_f4(); } // #cwg29-f4 413d358b2deSVlad Serebrennikov extern "C" void cwg29_f4(); 414d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'cwg29_f4' has a different language linkage}} 415d358b2deSVlad Serebrennikov // expected-note@#cwg29-f4 {{previous declaration is here}} 416d358b2deSVlad Serebrennikov 417d358b2deSVlad Serebrennikov extern "C" void g5(); 418d358b2deSVlad Serebrennikov extern "C++" void cwg29_f5(); 419d358b2deSVlad Serebrennikov void g5() { 420d358b2deSVlad Serebrennikov void cwg29_f5(); // ok, g5 is extern "C" but we're not inside the linkage-specification here. 421d358b2deSVlad Serebrennikov } 422d358b2deSVlad Serebrennikov 423d358b2deSVlad Serebrennikov extern "C++" void g6(); 424d358b2deSVlad Serebrennikov extern "C" void cwg29_f6(); 425d358b2deSVlad Serebrennikov void g6() { 426d358b2deSVlad Serebrennikov void cwg29_f6(); // ok, g6 is extern "C" but we're not inside the linkage-specification here. 427d358b2deSVlad Serebrennikov } 428d358b2deSVlad Serebrennikov 429d358b2deSVlad Serebrennikov extern "C" void g7(); 430d358b2deSVlad Serebrennikov extern "C++" void cwg29_f7(); // #cwg29-f7 431d358b2deSVlad Serebrennikov extern "C" void g7() { 432d358b2deSVlad Serebrennikov void cwg29_f7(); 433d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'cwg29_f7' has a different language linkage}} 434d358b2deSVlad Serebrennikov // expected-note@#cwg29-f7 {{previous declaration is here}} 435d358b2deSVlad Serebrennikov } 436d358b2deSVlad Serebrennikov 437d358b2deSVlad Serebrennikov extern "C++" void g8(); 438d358b2deSVlad Serebrennikov extern "C" void cwg29_f8(); // #cwg29-f8 439d358b2deSVlad Serebrennikov extern "C++" void g8() { 440d358b2deSVlad Serebrennikov void cwg29_f8(); 441d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'cwg29_f8' has a different language linkage}} 442d358b2deSVlad Serebrennikov // expected-note@#cwg29-f8 {{previous declaration is here}} 443d358b2deSVlad Serebrennikov } 444463e61a0SVlad Serebrennikov } // namespace cwg29 445d358b2deSVlad Serebrennikov 446d358b2deSVlad Serebrennikov namespace cwg30 { // cwg30: sup 468 c++11 447d358b2deSVlad Serebrennikov struct A { 448d358b2deSVlad Serebrennikov template<int> static int f(); 449d358b2deSVlad Serebrennikov } a, *p = &a; 450d358b2deSVlad Serebrennikov // FIXME: It's not clear whether CWG468 applies to C++98 too. 451d358b2deSVlad Serebrennikov int x = A::template f<0>(); 452d358b2deSVlad Serebrennikov // cxx98-error@-1 {{'template' keyword outside of a template}} 453d358b2deSVlad Serebrennikov int y = a.template f<0>(); 454d358b2deSVlad Serebrennikov // cxx98-error@-1 {{'template' keyword outside of a template}} 455d358b2deSVlad Serebrennikov int z = p->template f<0>(); 456d358b2deSVlad Serebrennikov // cxx98-error@-1 {{'template' keyword outside of a template}} 457463e61a0SVlad Serebrennikov } // namespace cwg30 458d358b2deSVlad Serebrennikov 459d358b2deSVlad Serebrennikov namespace cwg31 { // cwg31: 2.8 460d358b2deSVlad Serebrennikov class X { 461d358b2deSVlad Serebrennikov private: 462d358b2deSVlad Serebrennikov void operator delete(void*); // #cwg31-delete 463d358b2deSVlad Serebrennikov }; 464d358b2deSVlad Serebrennikov // We would call X::operator delete if X() threw (even though it can't, 465d358b2deSVlad Serebrennikov // and even though we allocated the X using ::operator delete). 466d358b2deSVlad Serebrennikov X *p = new X; 467d358b2deSVlad Serebrennikov // expected-error@-1 {{'operator delete' is a private member of 'cwg31::X'}} 468d358b2deSVlad Serebrennikov // expected-note@#cwg31-delete {{declared private here}} 469463e61a0SVlad Serebrennikov } // namespace cwg31 470d358b2deSVlad Serebrennikov 471d358b2deSVlad Serebrennikov // cwg32: na 472d358b2deSVlad Serebrennikov 473d358b2deSVlad Serebrennikov namespace cwg33 { // cwg33: 9 474d358b2deSVlad Serebrennikov namespace X { struct S; void f(void (*)(S)); } // #cwg33-f-S 475d358b2deSVlad Serebrennikov namespace Y { struct T; void f(void (*)(T)); } // #cwg33-f-T 476d358b2deSVlad Serebrennikov void g(X::S); 477d358b2deSVlad Serebrennikov template<typename Z> Z g(Y::T); 478d358b2deSVlad Serebrennikov void h() { f(&g); } 479d358b2deSVlad Serebrennikov // expected-error@-1 {{call to 'f' is ambiguous}} 480d358b2deSVlad Serebrennikov // expected-note@#cwg33-f-S {{candidate function}} 481d358b2deSVlad Serebrennikov // expected-note@#cwg33-f-T {{candidate function}} 482d358b2deSVlad Serebrennikov 483d358b2deSVlad Serebrennikov template<typename T> void t(X::S); 484d358b2deSVlad Serebrennikov template<typename T, typename U = void> void u(X::S); 485d358b2deSVlad Serebrennikov // expected-error@-1 0-1 {{default template arguments for a function template are a C++11 extension}} 486d358b2deSVlad Serebrennikov void templ() { f(t<int>); f(u<int>); } 487d358b2deSVlad Serebrennikov 488d358b2deSVlad Serebrennikov // Even though v<int> cannot select the first overload, ADL considers it 489d358b2deSVlad Serebrennikov // and adds namespace Z to the set of associated namespaces, and then picks 490d358b2deSVlad Serebrennikov // Z::f even though that function has nothing to do with any associated type. 491d358b2deSVlad Serebrennikov namespace Z { struct Q; void f(void(*)()); } 492d358b2deSVlad Serebrennikov template<int> Z::Q v(); 493d358b2deSVlad Serebrennikov template<typename> void v(); 494d358b2deSVlad Serebrennikov void unrelated_templ() { f(v<int>); } 495d358b2deSVlad Serebrennikov 496d358b2deSVlad Serebrennikov namespace dependent { 497d358b2deSVlad Serebrennikov struct X {}; 498d358b2deSVlad Serebrennikov template<class T> struct Y { 499d358b2deSVlad Serebrennikov friend int operator+(X, void(*)(Y)) {} 500d358b2deSVlad Serebrennikov }; 501d358b2deSVlad Serebrennikov 502d358b2deSVlad Serebrennikov template<typename T> void f(Y<T>); 503d358b2deSVlad Serebrennikov int use = X() + f<int>; 504d358b2deSVlad Serebrennikov // expected-error@-1 {{invalid operands to binary expression ('X' and 'void (Y<int>)')}} 505d358b2deSVlad Serebrennikov } 506d358b2deSVlad Serebrennikov 507d358b2deSVlad Serebrennikov namespace member { 508d358b2deSVlad Serebrennikov struct Q {}; 509d358b2deSVlad Serebrennikov struct Y { friend int operator+(Q, Y (*)()); }; 510d358b2deSVlad Serebrennikov struct X { template<typename> static Y f(); }; 511d358b2deSVlad Serebrennikov int m = Q() + X().f<int>; // ok 512d358b2deSVlad Serebrennikov int n = Q() + (&(X().f<int>)); // ok 513d358b2deSVlad Serebrennikov } 514463e61a0SVlad Serebrennikov } // namespace cwg33 515d358b2deSVlad Serebrennikov 516d358b2deSVlad Serebrennikov // cwg34: na 517d358b2deSVlad Serebrennikov // cwg35: dup 178 518d358b2deSVlad Serebrennikov 519d358b2deSVlad Serebrennikov namespace cwg36 { // cwg36: 2.8 520d358b2deSVlad Serebrennikov namespace example1 { 521d358b2deSVlad Serebrennikov namespace A { 522d358b2deSVlad Serebrennikov int i; 523d358b2deSVlad Serebrennikov } 524d358b2deSVlad Serebrennikov 525d358b2deSVlad Serebrennikov namespace A1 { 526d358b2deSVlad Serebrennikov using A::i; 527d358b2deSVlad Serebrennikov using A::i; 528d358b2deSVlad Serebrennikov } 529d358b2deSVlad Serebrennikov 530d358b2deSVlad Serebrennikov void f() 531d358b2deSVlad Serebrennikov { 532d358b2deSVlad Serebrennikov using A::i; 533d358b2deSVlad Serebrennikov using A::i; 534d358b2deSVlad Serebrennikov } 535d358b2deSVlad Serebrennikov } 536d358b2deSVlad Serebrennikov 537d358b2deSVlad Serebrennikov namespace example2 { 538d358b2deSVlad Serebrennikov struct A 539d358b2deSVlad Serebrennikov { 540d358b2deSVlad Serebrennikov int i; 541d358b2deSVlad Serebrennikov static int j; 542d358b2deSVlad Serebrennikov }; 543d358b2deSVlad Serebrennikov 544d358b2deSVlad Serebrennikov struct B : A { }; 545d358b2deSVlad Serebrennikov struct C : A { }; 546d358b2deSVlad Serebrennikov 547d358b2deSVlad Serebrennikov struct D : virtual B, virtual C 548d358b2deSVlad Serebrennikov { 549d358b2deSVlad Serebrennikov using B::i; // #cwg36-ex2-B-i-first 550d358b2deSVlad Serebrennikov using B::i; 551d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 552d358b2deSVlad Serebrennikov // expected-note@#cwg36-ex2-B-i-first {{previous using declaration}} 553d358b2deSVlad Serebrennikov 554d358b2deSVlad Serebrennikov using C::i; // #cwg36-ex2-C-i-first 555d358b2deSVlad Serebrennikov using C::i; 556d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 557d358b2deSVlad Serebrennikov // expected-note@#cwg36-ex2-C-i-first {{previous using declaration}} 558d358b2deSVlad Serebrennikov 559d358b2deSVlad Serebrennikov using B::j; // #cwg36-ex2-B-j-first 560d358b2deSVlad Serebrennikov using B::j; 561d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 562d358b2deSVlad Serebrennikov // expected-note@#cwg36-ex2-B-j-first {{previous using declaration}} 563d358b2deSVlad Serebrennikov 564d358b2deSVlad Serebrennikov using C::j; // #cwg36-ex2-C-j-first 565d358b2deSVlad Serebrennikov using C::j; 566d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 567d358b2deSVlad Serebrennikov // expected-note@#cwg36-ex2-C-j-first {{previous using declaration}} 568d358b2deSVlad Serebrennikov }; 569d358b2deSVlad Serebrennikov } 570d358b2deSVlad Serebrennikov 571d358b2deSVlad Serebrennikov namespace example3 { 572d358b2deSVlad Serebrennikov template<typename T> 573d358b2deSVlad Serebrennikov struct A 574d358b2deSVlad Serebrennikov { 575d358b2deSVlad Serebrennikov T i; 576d358b2deSVlad Serebrennikov static T j; 577d358b2deSVlad Serebrennikov }; 578d358b2deSVlad Serebrennikov 579d358b2deSVlad Serebrennikov template<typename T> 580d358b2deSVlad Serebrennikov struct B : A<T> { }; 581d358b2deSVlad Serebrennikov template<typename T> 582d358b2deSVlad Serebrennikov struct C : A<T> { }; 583d358b2deSVlad Serebrennikov 584d358b2deSVlad Serebrennikov template<typename T> 585d358b2deSVlad Serebrennikov struct D : virtual B<T>, virtual C<T> 586d358b2deSVlad Serebrennikov { 587d358b2deSVlad Serebrennikov using B<T>::i; // #cwg36-ex3-B-i-first 588d358b2deSVlad Serebrennikov using B<T>::i; 589d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 590d358b2deSVlad Serebrennikov // expected-note@#cwg36-ex3-B-i-first {{previous using declaration}} 591d358b2deSVlad Serebrennikov 592d358b2deSVlad Serebrennikov using C<T>::i; // #cwg36-ex3-C-i-first 593d358b2deSVlad Serebrennikov using C<T>::i; 594d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 595d358b2deSVlad Serebrennikov // expected-note@#cwg36-ex3-C-i-first {{previous using declaration}} 596d358b2deSVlad Serebrennikov 597d358b2deSVlad Serebrennikov using B<T>::j; // #cwg36-ex3-B-j-first 598d358b2deSVlad Serebrennikov using B<T>::j; 599d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 600d358b2deSVlad Serebrennikov // expected-note@#cwg36-ex3-B-j-first {{previous using declaration}} 601d358b2deSVlad Serebrennikov 602d358b2deSVlad Serebrennikov using C<T>::j; // #cwg36-ex3-C-j-first 603d358b2deSVlad Serebrennikov using C<T>::j; 604d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 605d358b2deSVlad Serebrennikov // expected-note@#cwg36-ex3-C-j-first {{previous using declaration}} 606d358b2deSVlad Serebrennikov }; 607d358b2deSVlad Serebrennikov } 608d358b2deSVlad Serebrennikov namespace example4 { 609d358b2deSVlad Serebrennikov template<typename T> 610d358b2deSVlad Serebrennikov struct E { 611d358b2deSVlad Serebrennikov T k; 612d358b2deSVlad Serebrennikov }; 613d358b2deSVlad Serebrennikov 614d358b2deSVlad Serebrennikov template<typename T> 615d358b2deSVlad Serebrennikov struct G : E<T> { 616d358b2deSVlad Serebrennikov using E<T>::k; // #cwg36-E-k-first 617d358b2deSVlad Serebrennikov using E<T>::k; 618d358b2deSVlad Serebrennikov // expected-error@-1 {{redeclaration of using declaration}} 619d358b2deSVlad Serebrennikov // expected-note@#cwg36-E-k-first {{previous using declaration}} 620d358b2deSVlad Serebrennikov }; 621d358b2deSVlad Serebrennikov } 622463e61a0SVlad Serebrennikov } // namespace cwg36 623d358b2deSVlad Serebrennikov 624d358b2deSVlad Serebrennikov // cwg37: sup 475 625d358b2deSVlad Serebrennikov 62614ba3f9dSVlad Serebrennikov namespace cwg38 { // cwg38: 2.7 627d358b2deSVlad Serebrennikov template<typename T> struct X {}; 628d358b2deSVlad Serebrennikov template<typename T> X<T> operator+(X<T> a, X<T> b) { return a; } 629d358b2deSVlad Serebrennikov template X<int> operator+<int>(X<int>, X<int>); 630463e61a0SVlad Serebrennikov } // namespace cwg38 631d358b2deSVlad Serebrennikov 632d358b2deSVlad Serebrennikov namespace cwg39 { // cwg39: no 633d358b2deSVlad Serebrennikov namespace example1 { 634d358b2deSVlad Serebrennikov struct A { int &f(int); }; 635d358b2deSVlad Serebrennikov struct B : A { 636d358b2deSVlad Serebrennikov using A::f; 637d358b2deSVlad Serebrennikov float &f(float); 638d358b2deSVlad Serebrennikov } b; 639d358b2deSVlad Serebrennikov int &r = b.f(0); 640d358b2deSVlad Serebrennikov } 641d358b2deSVlad Serebrennikov 642d358b2deSVlad Serebrennikov namespace example2 { 643d358b2deSVlad Serebrennikov struct A { 644d358b2deSVlad Serebrennikov int &x(int); // #cwg39-A-x-decl 645d358b2deSVlad Serebrennikov static int &y(int); // #cwg39-A-y-decl 646d358b2deSVlad Serebrennikov }; 647d358b2deSVlad Serebrennikov struct V { 648d358b2deSVlad Serebrennikov int &z(int); 649d358b2deSVlad Serebrennikov }; 650d358b2deSVlad Serebrennikov struct B : A, virtual V { 651d358b2deSVlad Serebrennikov using A::x; // #cwg39-using-A-x 652d358b2deSVlad Serebrennikov float &x(float); 653d358b2deSVlad Serebrennikov using A::y; // #cwg39-using-A-y 654d358b2deSVlad Serebrennikov static float &y(float); 655d358b2deSVlad Serebrennikov using V::z; 656d358b2deSVlad Serebrennikov float &z(float); 657d358b2deSVlad Serebrennikov }; 658d358b2deSVlad Serebrennikov struct C : A, B, virtual V {} c; 659d358b2deSVlad Serebrennikov /* expected-warning@-1 660d358b2deSVlad Serebrennikov {{direct base 'A' is inaccessible due to ambiguity: 661d358b2deSVlad Serebrennikov struct cwg39::example2::C -> A 662d358b2deSVlad Serebrennikov struct cwg39::example2::C -> B -> A}} */ 663d358b2deSVlad Serebrennikov int &x = c.x(0); 664d358b2deSVlad Serebrennikov // expected-error@-1 {{member 'x' found in multiple base classes of different types}} 665d358b2deSVlad Serebrennikov // expected-note@#cwg39-A-x-decl {{member found by ambiguous name lookup}} 666d358b2deSVlad Serebrennikov // expected-note@#cwg39-using-A-x {{member found by ambiguous name lookup}} 667d358b2deSVlad Serebrennikov 668d358b2deSVlad Serebrennikov // FIXME: This is valid, because we find the same static data member either way. 669d358b2deSVlad Serebrennikov int &y = c.y(0); 670d358b2deSVlad Serebrennikov // expected-error@-1 {{member 'y' found in multiple base classes of different types}} 671d358b2deSVlad Serebrennikov // expected-note@#cwg39-A-y-decl {{member found by ambiguous name lookup}} 672d358b2deSVlad Serebrennikov // expected-note@#cwg39-using-A-y {{member found by ambiguous name lookup}} 673d358b2deSVlad Serebrennikov int &z = c.z(0); 674d358b2deSVlad Serebrennikov } 675d358b2deSVlad Serebrennikov 676d358b2deSVlad Serebrennikov namespace example3 { 677d358b2deSVlad Serebrennikov struct A { static int f(); }; 678d358b2deSVlad Serebrennikov struct B : virtual A { using A::f; }; 679d358b2deSVlad Serebrennikov struct C : virtual A { using A::f; }; 680d358b2deSVlad Serebrennikov struct D : B, C {} d; 681d358b2deSVlad Serebrennikov int k = d.f(); 682d358b2deSVlad Serebrennikov } 683d358b2deSVlad Serebrennikov 684d358b2deSVlad Serebrennikov namespace example4 { 685d358b2deSVlad Serebrennikov struct A { int n; }; // #cwg39-ex4-A-n 686d358b2deSVlad Serebrennikov struct B : A {}; 687d358b2deSVlad Serebrennikov struct C : A {}; 688d358b2deSVlad Serebrennikov struct D : B, C { int f() { return n; } }; 689d358b2deSVlad Serebrennikov /* expected-error@-1 690d358b2deSVlad Serebrennikov {{non-static member 'n' found in multiple base-class subobjects of type 'A': 691d358b2deSVlad Serebrennikov struct cwg39::example4::D -> B -> A 692d358b2deSVlad Serebrennikov struct cwg39::example4::D -> C -> A}} */ 693d358b2deSVlad Serebrennikov // expected-note@#cwg39-ex4-A-n {{member found by ambiguous name lookup}} 694d358b2deSVlad Serebrennikov } 695d358b2deSVlad Serebrennikov 696d358b2deSVlad Serebrennikov namespace PR5916 { 697d358b2deSVlad Serebrennikov // FIXME: This is valid. 698d358b2deSVlad Serebrennikov struct A { int n; }; // #cwg39-A-n 699d358b2deSVlad Serebrennikov struct B : A {}; 700d358b2deSVlad Serebrennikov struct C : A {}; 701d358b2deSVlad Serebrennikov struct D : B, C {}; 702d358b2deSVlad Serebrennikov int k = sizeof(D::n); // #cwg39-sizeof 703d358b2deSVlad Serebrennikov /* expected-error@#cwg39-sizeof 704d358b2deSVlad Serebrennikov {{non-static member 'n' found in multiple base-class subobjects of type 'A': 705d358b2deSVlad Serebrennikov struct cwg39::PR5916::D -> B -> A 706d358b2deSVlad Serebrennikov struct cwg39::PR5916::D -> C -> A}} */ 707d358b2deSVlad Serebrennikov // expected-note@#cwg39-A-n {{member found by ambiguous name lookup}} 708d358b2deSVlad Serebrennikov 709d358b2deSVlad Serebrennikov // expected-error@#cwg39-sizeof {{unknown type name}} 710d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L 711d358b2deSVlad Serebrennikov decltype(D::n) n; 712eff12650SVlad Serebrennikov /* since-cxx11-error@-1 713d358b2deSVlad Serebrennikov {{non-static member 'n' found in multiple base-class subobjects of type 'A': 714d358b2deSVlad Serebrennikov struct cwg39::PR5916::D -> B -> A 715d358b2deSVlad Serebrennikov struct cwg39::PR5916::D -> C -> A}} */ 716eff12650SVlad Serebrennikov // since-cxx11-note@#cwg39-A-n {{member found by ambiguous name lookup}} 717d358b2deSVlad Serebrennikov #endif 718d358b2deSVlad Serebrennikov } 719463e61a0SVlad Serebrennikov } // namespace cwg39 720d358b2deSVlad Serebrennikov 721d358b2deSVlad Serebrennikov // cwg40: na 722d358b2deSVlad Serebrennikov 72314ba3f9dSVlad Serebrennikov namespace cwg41 { // cwg41: 2.7 724d358b2deSVlad Serebrennikov struct S f(S); 725463e61a0SVlad Serebrennikov } // namespace cwg41 726d358b2deSVlad Serebrennikov 72714ba3f9dSVlad Serebrennikov namespace cwg42 { // cwg42: 2.7 728d358b2deSVlad Serebrennikov struct A { static const int k = 0; }; 729d358b2deSVlad Serebrennikov struct B : A { static const int k = A::k; }; 730463e61a0SVlad Serebrennikov } // namespace cwg42 731d358b2deSVlad Serebrennikov 732d358b2deSVlad Serebrennikov // cwg43: na 733d358b2deSVlad Serebrennikov 734d358b2deSVlad Serebrennikov namespace cwg44 { // cwg44: sup 727 735d358b2deSVlad Serebrennikov struct A { 736d358b2deSVlad Serebrennikov template<int> void f(); 737d358b2deSVlad Serebrennikov template<> void f<0>(); 738d358b2deSVlad Serebrennikov }; 739463e61a0SVlad Serebrennikov } // namespace cwg44 740d358b2deSVlad Serebrennikov 74114ba3f9dSVlad Serebrennikov namespace cwg45 { // cwg45: 2.7 742d358b2deSVlad Serebrennikov class A { 743d358b2deSVlad Serebrennikov class B {}; 744d358b2deSVlad Serebrennikov class C : B {}; 745d358b2deSVlad Serebrennikov C c; 746d358b2deSVlad Serebrennikov }; 747463e61a0SVlad Serebrennikov } // namespace cwg45 748d358b2deSVlad Serebrennikov 74914ba3f9dSVlad Serebrennikov namespace cwg46 { // cwg46: 2.7 750d358b2deSVlad Serebrennikov template<typename> struct A { template<typename> struct B {}; }; 751d358b2deSVlad Serebrennikov template template struct A<int>::B<int>; 752d358b2deSVlad Serebrennikov // expected-error@-1 {{expected unqualified-id}} 753463e61a0SVlad Serebrennikov } // namespace cwg46 754d358b2deSVlad Serebrennikov 755d358b2deSVlad Serebrennikov namespace cwg47 { // cwg47: sup 329 756d358b2deSVlad Serebrennikov template<typename T> struct A { 757d358b2deSVlad Serebrennikov friend void f() { T t; } // #cwg47-f 758d358b2deSVlad Serebrennikov // expected-error@-1 {{redefinition of 'f'}} 759d358b2deSVlad Serebrennikov // expected-note@#cwg47-b {{in instantiation of template class 'cwg47::A<float>' requested here}} 760d358b2deSVlad Serebrennikov // expected-note@#cwg47-f {{previous definition is here}} 761d358b2deSVlad Serebrennikov }; 762d358b2deSVlad Serebrennikov A<int> a; 763d358b2deSVlad Serebrennikov A<float> b; // #cwg47-b 764d358b2deSVlad Serebrennikov 765d358b2deSVlad Serebrennikov void f(); 766d358b2deSVlad Serebrennikov void g() { f(); } 767463e61a0SVlad Serebrennikov } // namespace cwg47 768d358b2deSVlad Serebrennikov 76914ba3f9dSVlad Serebrennikov namespace cwg48 { // cwg48: 2.7 770d358b2deSVlad Serebrennikov namespace { 771d358b2deSVlad Serebrennikov struct S { 772d358b2deSVlad Serebrennikov static const int m = 0; 773d358b2deSVlad Serebrennikov static const int n = 0; 774d358b2deSVlad Serebrennikov static const int o = 0; 775d358b2deSVlad Serebrennikov }; 776d358b2deSVlad Serebrennikov } 777d358b2deSVlad Serebrennikov int a = S::m; 778d358b2deSVlad Serebrennikov // FIXME: We should produce a 'has internal linkage but is not defined' 779d358b2deSVlad Serebrennikov // diagnostic for 'S::n'. 780d358b2deSVlad Serebrennikov const int &b = S::n; 781d358b2deSVlad Serebrennikov const int S::o; 782d358b2deSVlad Serebrennikov const int &c = S::o; 783463e61a0SVlad Serebrennikov } // namespace cwg48 784d358b2deSVlad Serebrennikov 785d358b2deSVlad Serebrennikov namespace cwg49 { // cwg49: 2.8 786d358b2deSVlad Serebrennikov template<int*> struct A {}; // #cwg49-A 787d358b2deSVlad Serebrennikov int k; 788d358b2deSVlad Serebrennikov #if __has_feature(cxx_constexpr) 789d358b2deSVlad Serebrennikov constexpr 790d358b2deSVlad Serebrennikov #endif 791d358b2deSVlad Serebrennikov int *const p = &k; // #cwg49-p 792d358b2deSVlad Serebrennikov A<&k> a; 793d358b2deSVlad Serebrennikov A<p> b; // #cwg49-b 794d358b2deSVlad Serebrennikov // cxx98-error@#cwg49-b {{non-type template argument referring to object 'p' with internal linkage is a C++11 extension}} 795d358b2deSVlad Serebrennikov // cxx98-note@#cwg49-p {{non-type template argument refers to object here}} 796d358b2deSVlad Serebrennikov // cxx98-14-error@#cwg49-b {{non-type template argument for template parameter of pointer type 'int *' must have its address taken}} 797d358b2deSVlad Serebrennikov // cxx98-14-note@#cwg49-A {{template parameter is declared here}} 798d358b2deSVlad Serebrennikov int *q = &k; // #cwg49-q 799d358b2deSVlad Serebrennikov A<q> c; // #cwg49-c 800d358b2deSVlad Serebrennikov // cxx98-error@#cwg49-c {{non-type template argument for template parameter of pointer type 'int *' must have its address taken}} 801d358b2deSVlad Serebrennikov // cxx98-note@#cwg49-A {{template parameter is declared here}} 802d358b2deSVlad Serebrennikov // cxx11-14-error@#cwg49-c {{non-type template argument of type 'int *' is not a constant expression}} 803d358b2deSVlad Serebrennikov // cxx11-14-note@#cwg49-c {{read of non-constexpr variable 'q' is not allowed in a constant expression}} 804d358b2deSVlad Serebrennikov // cxx11-14-note@#cwg49-q {{declared here}} 805d358b2deSVlad Serebrennikov // cxx11-14-note@#cwg49-A {{template parameter is declared here}} 806d358b2deSVlad Serebrennikov // since-cxx17-error@#cwg49-c {{non-type template argument is not a constant expression}} 807d358b2deSVlad Serebrennikov // since-cxx17-note@#cwg49-c {{read of non-constexpr variable 'q' is not allowed in a constant expression}} 808d358b2deSVlad Serebrennikov // since-cxx17-note@#cwg49-q {{declared here}} 809463e61a0SVlad Serebrennikov } // namespace cwg49 810d358b2deSVlad Serebrennikov 81114ba3f9dSVlad Serebrennikov namespace cwg50 { // cwg50: 2.7 812d358b2deSVlad Serebrennikov struct X; // #cwg50-X 813d358b2deSVlad Serebrennikov extern X *p; 814d358b2deSVlad Serebrennikov X *q = (X*)p; 815d358b2deSVlad Serebrennikov X *r = static_cast<X*>(p); 816d358b2deSVlad Serebrennikov X *s = const_cast<X*>(p); 817d358b2deSVlad Serebrennikov X *t = reinterpret_cast<X*>(p); 818d358b2deSVlad Serebrennikov X *u = dynamic_cast<X*>(p); 819d358b2deSVlad Serebrennikov // expected-error@-1 {{'cwg50::X' is an incomplete type}} 820d358b2deSVlad Serebrennikov // expected-note@#cwg50-X {{forward declaration of 'cwg50::X'}} 821463e61a0SVlad Serebrennikov } // namespace cwg50 822d358b2deSVlad Serebrennikov 823d358b2deSVlad Serebrennikov namespace cwg51 { // cwg51: 2.8 824d358b2deSVlad Serebrennikov struct A {}; 825d358b2deSVlad Serebrennikov struct B : A {}; 826d358b2deSVlad Serebrennikov struct S { 827d358b2deSVlad Serebrennikov operator A&(); 828d358b2deSVlad Serebrennikov operator B&(); 829d358b2deSVlad Serebrennikov } s; 830d358b2deSVlad Serebrennikov A &a = s; 831463e61a0SVlad Serebrennikov } // namespace cwg51 832d358b2deSVlad Serebrennikov 833d358b2deSVlad Serebrennikov namespace cwg52 { // cwg52: 2.8 834d358b2deSVlad Serebrennikov struct A { int n; }; // #cwg52-A 835d358b2deSVlad Serebrennikov struct B : private A {} b; // #cwg52-B 836d358b2deSVlad Serebrennikov int k = b.A::n; // #cwg52-k 837d358b2deSVlad Serebrennikov // FIXME: This first diagnostic is very strangely worded, and seems to be bogus. 838d358b2deSVlad Serebrennikov // expected-error@#cwg52-k {{'A' is a private member of 'cwg52::A'}} 839d358b2deSVlad Serebrennikov // expected-note@#cwg52-B {{constrained by private inheritance here}} 840d358b2deSVlad Serebrennikov // expected-note@#cwg52-A {{member is declared here}} 841d358b2deSVlad Serebrennikov // expected-error@#cwg52-k {{cannot cast 'struct B' to its private base class 'cwg52::A'}} 842d358b2deSVlad Serebrennikov // expected-note@#cwg52-B {{declared private here}} 843463e61a0SVlad Serebrennikov } // namespace cwg52 844d358b2deSVlad Serebrennikov 84514ba3f9dSVlad Serebrennikov namespace cwg53 { // cwg53: 2.7 846d358b2deSVlad Serebrennikov int n = 0; 847d358b2deSVlad Serebrennikov enum E { e } x = static_cast<E>(n); 848463e61a0SVlad Serebrennikov } // namespace cwg53 849d358b2deSVlad Serebrennikov 850d358b2deSVlad Serebrennikov namespace cwg54 { // cwg54: 2.8 851d358b2deSVlad Serebrennikov struct A { int a; } a; 852d358b2deSVlad Serebrennikov struct V { int v; } v; 853d358b2deSVlad Serebrennikov struct B : private A, virtual V { int b; } b; // #cwg54-B 854d358b2deSVlad Serebrennikov 855d358b2deSVlad Serebrennikov A &sab = static_cast<A&>(b); 856d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot cast 'struct B' to its private base class 'A'}} 857d358b2deSVlad Serebrennikov // expected-note@#cwg54-B {{declared private here}} 858d358b2deSVlad Serebrennikov A *spab = static_cast<A*>(&b); 859d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot cast 'struct B' to its private base class 'A'}} 860d358b2deSVlad Serebrennikov // expected-note@#cwg54-B {{declared private here}} 861d358b2deSVlad Serebrennikov int A::*smab = static_cast<int A::*>(&B::b); 86270c1764dSNathan Ridge // expected-error@-1 {{cannot cast 'cwg54::B' to its private base class 'A'}} 863d358b2deSVlad Serebrennikov // expected-note@#cwg54-B {{declared private here}} 864d358b2deSVlad Serebrennikov B &sba = static_cast<B&>(a); 865d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot cast private base class 'cwg54::A' to 'cwg54::B'}} 866d358b2deSVlad Serebrennikov // expected-note@#cwg54-B {{declared private here}} 867d358b2deSVlad Serebrennikov B *spba = static_cast<B*>(&a); 868d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot cast private base class 'cwg54::A' to 'cwg54::B'}} 869d358b2deSVlad Serebrennikov // expected-note@#cwg54-B {{declared private here}} 870d358b2deSVlad Serebrennikov int B::*smba = static_cast<int B::*>(&A::a); 87170c1764dSNathan Ridge // expected-error@-1 {{cannot cast private base class 'cwg54::A' to 'B'}} 872d358b2deSVlad Serebrennikov // expected-note@#cwg54-B {{declared private here}} 873d358b2deSVlad Serebrennikov 874d358b2deSVlad Serebrennikov V &svb = static_cast<V&>(b); 875d358b2deSVlad Serebrennikov V *spvb = static_cast<V*>(&b); 876d358b2deSVlad Serebrennikov int V::*smvb = static_cast<int V::*>(&B::b); 87770c1764dSNathan Ridge // expected-error@-1 {{conversion from pointer to member of class 'cwg54::B' to pointer to member of class 'V' via virtual base 'cwg54::V' is not allowed}} 878d358b2deSVlad Serebrennikov B &sbv = static_cast<B&>(v); 879d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot cast 'struct V' to 'B &' via virtual base 'cwg54::V'}} 880d358b2deSVlad Serebrennikov B *spbv = static_cast<B*>(&v); 881d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot cast 'cwg54::V *' to 'B *' via virtual base 'cwg54::V'}} 882d358b2deSVlad Serebrennikov int B::*smbv = static_cast<int B::*>(&V::v); 88370c1764dSNathan Ridge // expected-error@-1 {{conversion from pointer to member of class 'cwg54::V' to pointer to member of class 'B' via virtual base 'cwg54::V' is not allowed}} 884d358b2deSVlad Serebrennikov 885d358b2deSVlad Serebrennikov A &cab = (A&)(b); 886d358b2deSVlad Serebrennikov A *cpab = (A*)(&b); 887d358b2deSVlad Serebrennikov int A::*cmab = (int A::*)(&B::b); 888d358b2deSVlad Serebrennikov B &cba = (B&)(a); 889d358b2deSVlad Serebrennikov B *cpba = (B*)(&a); 890d358b2deSVlad Serebrennikov int B::*cmba = (int B::*)(&A::a); 891d358b2deSVlad Serebrennikov 892d358b2deSVlad Serebrennikov V &cvb = (V&)(b); 893d358b2deSVlad Serebrennikov V *cpvb = (V*)(&b); 894d358b2deSVlad Serebrennikov int V::*cmvb = (int V::*)(&B::b); 89570c1764dSNathan Ridge // expected-error@-1 {{conversion from pointer to member of class 'cwg54::B' to pointer to member of class 'V' via virtual base 'cwg54::V' is not allowed}} 896d358b2deSVlad Serebrennikov B &cbv = (B&)(v); 897d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot cast 'struct V' to 'B &' via virtual base 'cwg54::V'}} 898d358b2deSVlad Serebrennikov B *cpbv = (B*)(&v); 899d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot cast 'cwg54::V *' to 'B *' via virtual base 'cwg54::V'}} 900d358b2deSVlad Serebrennikov int B::*cmbv = (int B::*)(&V::v); 90170c1764dSNathan Ridge // expected-error@-1 {{conversion from pointer to member of class 'cwg54::V' to pointer to member of class 'B' via virtual base 'cwg54::V' is not allowed}} 902463e61a0SVlad Serebrennikov } // namespace cwg54 903d358b2deSVlad Serebrennikov 90414ba3f9dSVlad Serebrennikov namespace cwg55 { // cwg55: 2.7 905d358b2deSVlad Serebrennikov enum E { e = 5 }; 906d358b2deSVlad Serebrennikov static_assert(e + 1 == 6, ""); 907463e61a0SVlad Serebrennikov } // namespace cwg55 908d358b2deSVlad Serebrennikov 90914ba3f9dSVlad Serebrennikov namespace cwg56 { // cwg56: 2.7 910d358b2deSVlad Serebrennikov struct A { 911d358b2deSVlad Serebrennikov typedef int T; // #cwg56-typedef-int-T-first 912d358b2deSVlad Serebrennikov typedef int T; 913d358b2deSVlad Serebrennikov // expected-error@-1 {{redefinition of 'T'}} 914d358b2deSVlad Serebrennikov // expected-note@#cwg56-typedef-int-T-first {{previous definition is here}} 915d358b2deSVlad Serebrennikov }; 916d358b2deSVlad Serebrennikov struct B { 917d358b2deSVlad Serebrennikov struct X; 918d358b2deSVlad Serebrennikov typedef X X; // #cwg56-typedef-X-X-first 919d358b2deSVlad Serebrennikov typedef X X; 920d358b2deSVlad Serebrennikov // expected-error@-1 {{redefinition of 'X'}} 921d358b2deSVlad Serebrennikov // expected-note@#cwg56-typedef-X-X-first {{previous definition is here}} 922d358b2deSVlad Serebrennikov }; 923463e61a0SVlad Serebrennikov } // namespace cwg56 924d358b2deSVlad Serebrennikov 925d358b2deSVlad Serebrennikov namespace cwg58 { // cwg58: 3.1 926d358b2deSVlad Serebrennikov // FIXME: Ideally, we should have a CodeGen test for this. 927d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L 928d358b2deSVlad Serebrennikov enum E1 { E1_0 = 0, E1_1 = 1 }; 929d358b2deSVlad Serebrennikov enum E2 { E2_0 = 0, E2_m1 = -1 }; 930d358b2deSVlad Serebrennikov struct X { E1 e1 : 1; E2 e2 : 1; }; 931d358b2deSVlad Serebrennikov static_assert(X{E1_1, E2_m1}.e1 == 1, ""); 932d358b2deSVlad Serebrennikov static_assert(X{E1_1, E2_m1}.e2 == -1, ""); 933d358b2deSVlad Serebrennikov #endif 934463e61a0SVlad Serebrennikov } // namespace cwg58 935d358b2deSVlad Serebrennikov 93614ba3f9dSVlad Serebrennikov namespace cwg59 { // cwg59: 2.7 937d358b2deSVlad Serebrennikov #pragma clang diagnostic push 938d358b2deSVlad Serebrennikov #pragma clang diagnostic ignored "-Wdeprecated-volatile" 939d358b2deSVlad Serebrennikov template<typename T> struct convert_to { operator T() const; }; 940d358b2deSVlad Serebrennikov struct A {}; // #cwg59-A 941d358b2deSVlad Serebrennikov struct B : A {}; // #cwg59-B 942d358b2deSVlad Serebrennikov 943d358b2deSVlad Serebrennikov A a1 = convert_to<A>(); 944d358b2deSVlad Serebrennikov A a2 = convert_to<A&>(); 945d358b2deSVlad Serebrennikov A a3 = convert_to<const A>(); 946d358b2deSVlad Serebrennikov A a4 = convert_to<const volatile A>(); 947d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::A'}} 948d358b2deSVlad Serebrennikov // cxx98-14-note@#cwg59-A {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const volatile cwg59::A') would lose volatile qualifier}} 949d358b2deSVlad Serebrennikov // cxx11-14-note@#cwg59-A {{candidate constructor (the implicit move constructor) not viable: 1st argument ('const volatile cwg59::A') would lose const and volatile qualifiers}} 950d358b2deSVlad Serebrennikov // cxx98-14-note@#cwg59-A {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 951d358b2deSVlad Serebrennikov A a5 = convert_to<const volatile A&>(); 952d358b2deSVlad Serebrennikov // expected-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::A'}} 953d358b2deSVlad Serebrennikov // expected-note@#cwg59-A {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const volatile cwg59::A') would lose volatile qualifier}} 954d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg59-A {{candidate constructor (the implicit move constructor) not viable: 1st argument ('const volatile cwg59::A') would lose const and volatile qualifiers}} 955d358b2deSVlad Serebrennikov // expected-note@#cwg59-A {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 956d358b2deSVlad Serebrennikov 957d358b2deSVlad Serebrennikov B b1 = convert_to<B>(); 958d358b2deSVlad Serebrennikov B b2 = convert_to<B&>(); 959d358b2deSVlad Serebrennikov B b3 = convert_to<const B>(); 960d358b2deSVlad Serebrennikov B b4 = convert_to<const volatile B>(); 961d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::B'}} 962d358b2deSVlad Serebrennikov // cxx98-14-note@#cwg59-B {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const volatile cwg59::B') would lose volatile qualifier}} 963d358b2deSVlad Serebrennikov // cxx11-14-note@#cwg59-B {{candidate constructor (the implicit move constructor) not viable: 1st argument ('const volatile cwg59::B') would lose const and volatile qualifiers}} 964d358b2deSVlad Serebrennikov // cxx98-14-note@#cwg59-B {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 965d358b2deSVlad Serebrennikov B b5 = convert_to<const volatile B&>(); 966d358b2deSVlad Serebrennikov // expected-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::B'}} 967d358b2deSVlad Serebrennikov // expected-note@#cwg59-B {{candidate constructor (the implicit copy constructor) not viable: 1st argument ('const volatile cwg59::B') would lose volatile qualifier}} 968d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg59-B {{candidate constructor (the implicit move constructor) not viable: 1st argument ('const volatile cwg59::B') would lose const and volatile qualifiers}} 969d358b2deSVlad Serebrennikov // expected-note@#cwg59-B {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 970d358b2deSVlad Serebrennikov 971d358b2deSVlad Serebrennikov A c1 = convert_to<B>(); 972d358b2deSVlad Serebrennikov A c2 = convert_to<B&>(); 973d358b2deSVlad Serebrennikov A c3 = convert_to<const B>(); 974d358b2deSVlad Serebrennikov A c4 = convert_to<const volatile B>(); 975d358b2deSVlad Serebrennikov // expected-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::B'}} 976d358b2deSVlad Serebrennikov // expected-note@#cwg59-A {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'const volatile cwg59::B' to 'const A &' for 1st argument}} 977d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg59-A {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'const volatile cwg59::B' to 'A &&' for 1st argument}} 978d358b2deSVlad Serebrennikov // expected-note@#cwg59-A {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 979d358b2deSVlad Serebrennikov A c5 = convert_to<const volatile B&>(); 980d358b2deSVlad Serebrennikov // expected-error@-1 {{no viable constructor copying variable of type 'const volatile cwg59::B'}} 981d358b2deSVlad Serebrennikov // expected-note@#cwg59-A {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'const volatile cwg59::B' to 'const A &' for 1st argument}} 982d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg59-A {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'const volatile cwg59::B' to 'A &&' for 1st argument}} 983d358b2deSVlad Serebrennikov // expected-note@#cwg59-A {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 984d358b2deSVlad Serebrennikov 985d358b2deSVlad Serebrennikov int n1 = convert_to<int>(); 986d358b2deSVlad Serebrennikov int n2 = convert_to<int&>(); 987d358b2deSVlad Serebrennikov int n3 = convert_to<const int>(); 988d358b2deSVlad Serebrennikov int n4 = convert_to<const volatile int>(); 989d358b2deSVlad Serebrennikov int n5 = convert_to<const volatile int&>(); 990d358b2deSVlad Serebrennikov #pragma clang diagnostic pop 991463e61a0SVlad Serebrennikov } // namespace cwg59 992d358b2deSVlad Serebrennikov 99314ba3f9dSVlad Serebrennikov namespace cwg60 { // cwg60: 2.7 994d358b2deSVlad Serebrennikov void f(int &); 995d358b2deSVlad Serebrennikov int &f(...); 996d358b2deSVlad Serebrennikov const int k = 0; 997d358b2deSVlad Serebrennikov int &n = f(k); 998463e61a0SVlad Serebrennikov } // namespace cwg60 999d358b2deSVlad Serebrennikov 1000d358b2deSVlad Serebrennikov namespace cwg61 { // cwg61: 3.4 1001d358b2deSVlad Serebrennikov struct X { 1002d358b2deSVlad Serebrennikov static void f(); 1003d358b2deSVlad Serebrennikov } x; 1004d358b2deSVlad Serebrennikov struct Y { 1005d358b2deSVlad Serebrennikov static void f(); 1006d358b2deSVlad Serebrennikov static void f(int); 1007d358b2deSVlad Serebrennikov } y; 1008d358b2deSVlad Serebrennikov // This is (presumably) valid, because x.f does not refer to an overloaded 1009d358b2deSVlad Serebrennikov // function name. 1010d358b2deSVlad Serebrennikov void (*p)() = &x.f; 1011d358b2deSVlad Serebrennikov void (*q)() = &y.f; 1012d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot create a non-constant pointer to member function}} 1013d358b2deSVlad Serebrennikov void (*r)() = y.f; 1014d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot create a non-constant pointer to member function}} 1015463e61a0SVlad Serebrennikov } // namespace cwg61 1016d358b2deSVlad Serebrennikov 1017d358b2deSVlad Serebrennikov namespace cwg62 { // cwg62: 2.9 1018d358b2deSVlad Serebrennikov struct A { 1019d358b2deSVlad Serebrennikov struct { int n; } b; 1020d358b2deSVlad Serebrennikov }; 1021d358b2deSVlad Serebrennikov template<typename T> struct X {}; 1022d358b2deSVlad Serebrennikov template<typename T> T get() { return get<T>(); } 1023d358b2deSVlad Serebrennikov template<typename T> int take(T) { return 0; } 1024d358b2deSVlad Serebrennikov 1025d358b2deSVlad Serebrennikov X<A> x1; 1026d358b2deSVlad Serebrennikov A a = get<A>(); 1027d358b2deSVlad Serebrennikov 1028d358b2deSVlad Serebrennikov typedef struct { } *NoNameForLinkagePtr; // #cwg62-unnamed 1029d358b2deSVlad Serebrennikov NoNameForLinkagePtr noNameForLinkagePtr; 1030d358b2deSVlad Serebrennikov 1031d358b2deSVlad Serebrennikov struct Danger { 1032d358b2deSVlad Serebrennikov NoNameForLinkagePtr p; 1033d358b2deSVlad Serebrennikov }; 1034d358b2deSVlad Serebrennikov 1035d358b2deSVlad Serebrennikov X<NoNameForLinkagePtr> x2; 1036d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses unnamed type}} 1037d358b2deSVlad Serebrennikov // cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}} 1038d358b2deSVlad Serebrennikov X<const NoNameForLinkagePtr> x3; 1039d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses unnamed type}} 1040d358b2deSVlad Serebrennikov // cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}} 1041d358b2deSVlad Serebrennikov NoNameForLinkagePtr p1 = get<NoNameForLinkagePtr>(); 1042d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses unnamed type}} 1043d358b2deSVlad Serebrennikov // cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}} 1044d358b2deSVlad Serebrennikov NoNameForLinkagePtr p2 = get<const NoNameForLinkagePtr>(); 1045d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses unnamed type}} 1046d358b2deSVlad Serebrennikov // cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}} 1047d358b2deSVlad Serebrennikov int n1 = take(noNameForLinkagePtr); 1048d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses unnamed type}} 1049d358b2deSVlad Serebrennikov // cxx98-note@#cwg62-unnamed {{unnamed type used in template argument was declared here}} 1050d358b2deSVlad Serebrennikov 1051d358b2deSVlad Serebrennikov X<Danger> x4; 1052d358b2deSVlad Serebrennikov 1053d358b2deSVlad Serebrennikov void f() { 1054d358b2deSVlad Serebrennikov struct NoLinkage {}; 1055d358b2deSVlad Serebrennikov X<NoLinkage> a; 1056d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses local type }} 1057d358b2deSVlad Serebrennikov X<const NoLinkage> b; 1058d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses local type }} 1059d358b2deSVlad Serebrennikov get<NoLinkage>(); 1060d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses local type }} 1061d358b2deSVlad Serebrennikov get<const NoLinkage>(); 1062d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses local type }} 1063d358b2deSVlad Serebrennikov X<void (*)(NoLinkage A::*)> c; 1064d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses local type }} 1065d358b2deSVlad Serebrennikov X<int NoLinkage::*> d; 1066d358b2deSVlad Serebrennikov // cxx98-error@-1 {{template argument uses local type }} 1067d358b2deSVlad Serebrennikov } 1068463e61a0SVlad Serebrennikov } // namespace cwg62 1069d358b2deSVlad Serebrennikov 107014ba3f9dSVlad Serebrennikov namespace cwg63 { // cwg63: 2.7 1071d358b2deSVlad Serebrennikov template<typename T> struct S { typename T::error e; }; 1072d358b2deSVlad Serebrennikov extern S<int> *p; 1073d358b2deSVlad Serebrennikov void *q = p; 1074463e61a0SVlad Serebrennikov } // namespace cwg63 1075d358b2deSVlad Serebrennikov 107614ba3f9dSVlad Serebrennikov namespace cwg64 { // cwg64: 2.7 1077d358b2deSVlad Serebrennikov template<class T> void f(T); 1078d358b2deSVlad Serebrennikov template<class T> void f(T*); 1079d358b2deSVlad Serebrennikov template<> void f(int*); 1080d358b2deSVlad Serebrennikov template<> void f<int>(int*); 1081d358b2deSVlad Serebrennikov template<> void f(int); 1082463e61a0SVlad Serebrennikov } // namespace cwg64 1083d358b2deSVlad Serebrennikov 1084d358b2deSVlad Serebrennikov // cwg65: na 1085d358b2deSVlad Serebrennikov 1086d358b2deSVlad Serebrennikov namespace cwg66 { // cwg66: no 1087d358b2deSVlad Serebrennikov namespace X { 1088d358b2deSVlad Serebrennikov int f(int n); // #cwg66-f-first 1089d358b2deSVlad Serebrennikov } 1090d358b2deSVlad Serebrennikov using X::f; 1091d358b2deSVlad Serebrennikov namespace X { 1092d358b2deSVlad Serebrennikov int f(int n = 0); 1093d358b2deSVlad Serebrennikov int f(int, int); 1094d358b2deSVlad Serebrennikov } 1095d358b2deSVlad Serebrennikov // FIXME: The first two calls here should be accepted. 1096d358b2deSVlad Serebrennikov int a = f(); 1097d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'f'}} 1098d358b2deSVlad Serebrennikov // expected-note@#cwg66-f-first {{candidate function not viable: requires single argument 'n', but no arguments were provided}} 1099d358b2deSVlad Serebrennikov int b = f(1); 1100d358b2deSVlad Serebrennikov int c = f(1, 2); 1101d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'f'}} 1102d358b2deSVlad Serebrennikov // expected-note@#cwg66-f-first {{candidate function not viable: requires single argument 'n', but 2 arguments were provided}} 1103463e61a0SVlad Serebrennikov } // namespace cwg66 1104d358b2deSVlad Serebrennikov 1105d358b2deSVlad Serebrennikov // cwg67: na 1106d358b2deSVlad Serebrennikov 1107d358b2deSVlad Serebrennikov namespace cwg68 { // cwg68: 2.8 1108d358b2deSVlad Serebrennikov template<typename T> struct X {}; 1109d358b2deSVlad Serebrennikov struct ::cwg68::X<int> x1; 1110d358b2deSVlad Serebrennikov struct ::cwg68::template X<int> x2; 1111d358b2deSVlad Serebrennikov // cxx98-error@-1 {{'template' keyword outside of a template}} 1112d358b2deSVlad Serebrennikov struct Y { 1113d358b2deSVlad Serebrennikov friend struct X<int>; 1114d358b2deSVlad Serebrennikov friend struct ::cwg68::X<char>; 1115d358b2deSVlad Serebrennikov friend struct ::cwg68::template X<double>; 1116d358b2deSVlad Serebrennikov // cxx98-error@-1 {{'template' keyword outside of a template}} 1117d358b2deSVlad Serebrennikov }; 1118d358b2deSVlad Serebrennikov template<typename> 1119d358b2deSVlad Serebrennikov struct Z { 1120d358b2deSVlad Serebrennikov friend struct ::cwg68::template X<double>; 1121d358b2deSVlad Serebrennikov friend typename ::cwg68::X<double>; 1122d358b2deSVlad Serebrennikov // cxx98-error@-1 {{unelaborated friend declaration is a C++11 extension; specify 'struct' to befriend 'typename ::cwg68::X<double>'}} 1123d358b2deSVlad Serebrennikov }; 1124463e61a0SVlad Serebrennikov } // namespace cwg68 1125d358b2deSVlad Serebrennikov 1126d358b2deSVlad Serebrennikov namespace cwg69 { // cwg69: 9 1127d358b2deSVlad Serebrennikov template<typename T> static void f() {} // #cwg69-f 1128d358b2deSVlad Serebrennikov // FIXME: Should we warn here? 1129d358b2deSVlad Serebrennikov inline void g() { f<int>(); } 1130d358b2deSVlad Serebrennikov extern template void f<char>(); 1131d358b2deSVlad Serebrennikov // cxx98-error@-1 {{extern templates are a C++11 extension}} 1132d358b2deSVlad Serebrennikov // expected-error@-2 {{explicit instantiation declaration of 'f' with internal linkage}} 1133d358b2deSVlad Serebrennikov template<void(*)()> struct Q {}; 1134d358b2deSVlad Serebrennikov Q<&f<int> > q; 1135d358b2deSVlad Serebrennikov // cxx98-error@-1 {{non-type template argument referring to function 'f<int>' with internal linkage is a C++11 extension}} 1136d358b2deSVlad Serebrennikov // cxx98-note@#cwg69-f {{non-type template argument refers to function here}} 1137463e61a0SVlad Serebrennikov } // namespace cwg69 1138d358b2deSVlad Serebrennikov 113914ba3f9dSVlad Serebrennikov namespace cwg70 { // cwg70: 2.7 1140d358b2deSVlad Serebrennikov template<int> struct A {}; 1141d358b2deSVlad Serebrennikov template<int I, int J> int f(int (&)[I + J], A<I>, A<J>); 1142d358b2deSVlad Serebrennikov int arr[7]; 1143d358b2deSVlad Serebrennikov int k = f(arr, A<3>(), A<4>()); 1144463e61a0SVlad Serebrennikov } // namespace cwg70 1145d358b2deSVlad Serebrennikov 1146d358b2deSVlad Serebrennikov // cwg71: na 1147d358b2deSVlad Serebrennikov // cwg72: dup 69 1148d358b2deSVlad Serebrennikov 1149d358b2deSVlad Serebrennikov namespace cwg73 { // cwg73: sup 1652 1150463e61a0SVlad Serebrennikov #if __cplusplus >= 201103L 1151d358b2deSVlad Serebrennikov int a, b; 1152d358b2deSVlad Serebrennikov static_assert(&a + 1 != &b, ""); 1153eff12650SVlad Serebrennikov // since-cxx11-error@-1 {{static assertion expression is not an integral constant expression}} 1154eff12650SVlad Serebrennikov // since-cxx11-note@-2 {{comparison against pointer '&a + 1' that points past the end of a complete object has unspecified value}} 1155d358b2deSVlad Serebrennikov #endif 1156463e61a0SVlad Serebrennikov } // namespace cwg73 1157d358b2deSVlad Serebrennikov 115814ba3f9dSVlad Serebrennikov namespace cwg74 { // cwg74: 2.7 1159d358b2deSVlad Serebrennikov enum E { k = 5 }; 1160d358b2deSVlad Serebrennikov int (*p)[k] = new int[k][k]; 1161463e61a0SVlad Serebrennikov } // namespace cwg74 1162d358b2deSVlad Serebrennikov 116314ba3f9dSVlad Serebrennikov namespace cwg75 { // cwg75: 2.7 1164d358b2deSVlad Serebrennikov struct S { 1165d358b2deSVlad Serebrennikov static int n = 0; 1166d358b2deSVlad Serebrennikov // expected-error@-1 {{non-const static data member must be initialized out of line}} 1167d358b2deSVlad Serebrennikov }; 1168463e61a0SVlad Serebrennikov } // namespace cwg75 1169d358b2deSVlad Serebrennikov 117014ba3f9dSVlad Serebrennikov namespace cwg76 { // cwg76: 2.7 1171d358b2deSVlad Serebrennikov const volatile int n = 1; 1172d358b2deSVlad Serebrennikov static_assert(n, ""); 1173d358b2deSVlad Serebrennikov // expected-error@-1 {{static assertion expression is not an integral constant expression}} 1174d358b2deSVlad Serebrennikov // expected-note@-2 {{read of volatile-qualified type 'const volatile int' is not allowed in a constant expression}} 1175463e61a0SVlad Serebrennikov } // namespace cwg76 1176d358b2deSVlad Serebrennikov 117714ba3f9dSVlad Serebrennikov namespace cwg77 { // cwg77: 2.7 1178d358b2deSVlad Serebrennikov struct A { 1179d358b2deSVlad Serebrennikov struct B {}; 1180d358b2deSVlad Serebrennikov friend struct B; 1181d358b2deSVlad Serebrennikov }; 1182463e61a0SVlad Serebrennikov } // namespace cwg77 1183d358b2deSVlad Serebrennikov 1184d358b2deSVlad Serebrennikov namespace cwg78 { // cwg78: sup ???? 1185d358b2deSVlad Serebrennikov // Under CWG78, this is valid, because 'k' has static storage duration, so is 1186d358b2deSVlad Serebrennikov // zero-initialized. 1187d358b2deSVlad Serebrennikov const int k; 1188d358b2deSVlad Serebrennikov // expected-error@-1 {{default initialization of an object of const type 'const int'}} 1189463e61a0SVlad Serebrennikov } // namespace cwg78 1190d358b2deSVlad Serebrennikov 1191d358b2deSVlad Serebrennikov // cwg79: na 1192d358b2deSVlad Serebrennikov 1193d358b2deSVlad Serebrennikov namespace cwg80 { // cwg80: 2.9 1194d358b2deSVlad Serebrennikov struct A { 1195d358b2deSVlad Serebrennikov int A; 1196d358b2deSVlad Serebrennikov }; 1197d358b2deSVlad Serebrennikov struct B { 1198d358b2deSVlad Serebrennikov static int B; 1199d358b2deSVlad Serebrennikov // expected-error@-1 {{member 'B' has the same name as its class}} 1200d358b2deSVlad Serebrennikov }; 1201d358b2deSVlad Serebrennikov struct C { 1202d358b2deSVlad Serebrennikov int C; 1203d358b2deSVlad Serebrennikov // expected-error@-1 {{member 'C' has the same name as its class}} 1204d358b2deSVlad Serebrennikov C(); 1205d358b2deSVlad Serebrennikov }; 1206d358b2deSVlad Serebrennikov struct D { 1207d358b2deSVlad Serebrennikov D(); 1208d358b2deSVlad Serebrennikov int D; 1209d358b2deSVlad Serebrennikov // expected-error@-1 {{member 'D' has the same name as its class}} 1210d358b2deSVlad Serebrennikov }; 1211463e61a0SVlad Serebrennikov } // namespace cwg80 1212d358b2deSVlad Serebrennikov 1213d358b2deSVlad Serebrennikov // cwg81: na 1214d358b2deSVlad Serebrennikov // cwg82: dup 48 1215d358b2deSVlad Serebrennikov 121614ba3f9dSVlad Serebrennikov namespace cwg83 { // cwg83: 2.7 1217d358b2deSVlad Serebrennikov int &f(const char*); 1218d358b2deSVlad Serebrennikov char &f(char *); 1219d358b2deSVlad Serebrennikov int &k = f("foo"); 1220463e61a0SVlad Serebrennikov } // namespace cwg83 1221d358b2deSVlad Serebrennikov 122214ba3f9dSVlad Serebrennikov namespace cwg84 { // cwg84: 2.7 1223d358b2deSVlad Serebrennikov struct B; 1224d358b2deSVlad Serebrennikov struct A { operator B() const; }; 1225d358b2deSVlad Serebrennikov struct C {}; 1226d358b2deSVlad Serebrennikov struct B { 1227d358b2deSVlad Serebrennikov B(B&); // #cwg84-copy-ctor 1228d358b2deSVlad Serebrennikov B(C); // #cwg84-ctor-from-C 1229d358b2deSVlad Serebrennikov operator C() const; 1230d358b2deSVlad Serebrennikov }; 1231d358b2deSVlad Serebrennikov A a; 1232d358b2deSVlad Serebrennikov // Cannot use B(C) / operator C() pair to construct the B from the B temporary 1233d358b2deSVlad Serebrennikov // here. In C++17, we initialize the B object directly using 'A::operator B()'. 1234d358b2deSVlad Serebrennikov B b = a; 1235d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{no viable constructor copying variable of type 'B'}} 1236d358b2deSVlad Serebrennikov // cxx98-14-note@#cwg84-copy-ctor {{candidate constructor not viable: expects an lvalue for 1st argument}} 1237d358b2deSVlad Serebrennikov // cxx98-14-note@#cwg84-ctor-from-C {{candidate constructor not viable: no known conversion from 'B' to 'C' for 1st argument}} 1238463e61a0SVlad Serebrennikov } // namespace cwg84 1239d358b2deSVlad Serebrennikov 1240d358b2deSVlad Serebrennikov namespace cwg85 { // cwg85: 3.4 1241d358b2deSVlad Serebrennikov struct A { 1242d358b2deSVlad Serebrennikov struct B; 1243d358b2deSVlad Serebrennikov struct B {}; // #cwg85-B-def 1244d358b2deSVlad Serebrennikov struct B; 1245d358b2deSVlad Serebrennikov // expected-error@-1 {{class member cannot be redeclared}} 1246d358b2deSVlad Serebrennikov // expected-note@#cwg85-B-def {{previous declaration is here}} 1247d358b2deSVlad Serebrennikov 1248d358b2deSVlad Serebrennikov union U; 1249d358b2deSVlad Serebrennikov union U {}; // #cwg85-U-def 1250d358b2deSVlad Serebrennikov union U; 1251d358b2deSVlad Serebrennikov // expected-error@-1 {{class member cannot be redeclared}} 1252d358b2deSVlad Serebrennikov // expected-note@#cwg85-U-def {{previous declaration is here}} 1253d358b2deSVlad Serebrennikov 1254d358b2deSVlad Serebrennikov #if __cplusplus >= 201103L 1255d358b2deSVlad Serebrennikov enum E1 : int; 1256d358b2deSVlad Serebrennikov enum E1 : int { e1 }; // #cwg85-E1-def 1257d358b2deSVlad Serebrennikov enum E1 : int; 1258eff12650SVlad Serebrennikov // since-cxx11-error@-1 {{class member cannot be redeclared}} 1259eff12650SVlad Serebrennikov // since-cxx11-note@#cwg85-E1-def {{previous declaration is here}} 1260d358b2deSVlad Serebrennikov 1261d358b2deSVlad Serebrennikov enum class E2; 1262d358b2deSVlad Serebrennikov enum class E2 { e2 }; // #cwg85-E2-def 1263d358b2deSVlad Serebrennikov enum class E2; 1264eff12650SVlad Serebrennikov // since-cxx11-error@-1 {{class member cannot be redeclared}} 1265eff12650SVlad Serebrennikov // since-cxx11-note@#cwg85-E2-def {{previous declaration is here}} 1266d358b2deSVlad Serebrennikov #endif 1267d358b2deSVlad Serebrennikov }; 1268d358b2deSVlad Serebrennikov 1269d358b2deSVlad Serebrennikov template <typename T> 1270d358b2deSVlad Serebrennikov struct C { 1271d358b2deSVlad Serebrennikov struct B {}; // #cwg85-C-B-def 1272d358b2deSVlad Serebrennikov struct B; 1273d358b2deSVlad Serebrennikov // expected-error@-1 {{class member cannot be redeclared}} 1274d358b2deSVlad Serebrennikov // expected-note@#cwg85-C-B-def {{previous declaration is here}} 1275d358b2deSVlad Serebrennikov }; 1276463e61a0SVlad Serebrennikov } // namespace cwg85 1277d358b2deSVlad Serebrennikov 1278d358b2deSVlad Serebrennikov // cwg86: dup 446 1279d358b2deSVlad Serebrennikov 1280d358b2deSVlad Serebrennikov namespace cwg87 { // cwg87: no 1281d358b2deSVlad Serebrennikov // FIXME: Superseded by cwg1975 1282d358b2deSVlad Serebrennikov template<typename T> struct X {}; 1283d358b2deSVlad Serebrennikov // FIXME: This is invalid. 1284d358b2deSVlad Serebrennikov X<void() throw()> x; 1285d358b2deSVlad Serebrennikov // This is valid under cwg87 but not under cwg1975. 1286d358b2deSVlad Serebrennikov X<void(void() throw())> y; 1287463e61a0SVlad Serebrennikov } // namespace cwg87 1288d358b2deSVlad Serebrennikov 1289d358b2deSVlad Serebrennikov namespace cwg88 { // cwg88: 2.8 1290d358b2deSVlad Serebrennikov template<typename T> struct S { 1291d358b2deSVlad Serebrennikov static const int a = 1; // #cwg88-a 1292d358b2deSVlad Serebrennikov static const int b; 1293d358b2deSVlad Serebrennikov }; 1294d358b2deSVlad Serebrennikov template<> const int S<int>::a = 4; 1295d358b2deSVlad Serebrennikov // expected-error@-1 {{static data member 'a' already has an initializer}} 1296d358b2deSVlad Serebrennikov // expected-note@#cwg88-a {{previous initialization is here}} 1297d358b2deSVlad Serebrennikov template<> const int S<int>::b = 4; 1298463e61a0SVlad Serebrennikov } // namespace cwg88 1299d358b2deSVlad Serebrennikov 1300d358b2deSVlad Serebrennikov // cwg89: na 1301d358b2deSVlad Serebrennikov 130214ba3f9dSVlad Serebrennikov namespace cwg90 { // cwg90: 2.7 1303d358b2deSVlad Serebrennikov struct A { 1304d358b2deSVlad Serebrennikov template<typename T> friend void cwg90_f(T); 1305d358b2deSVlad Serebrennikov }; 1306d358b2deSVlad Serebrennikov struct B : A { 1307d358b2deSVlad Serebrennikov template<typename T> friend void cwg90_g(T); 1308d358b2deSVlad Serebrennikov struct C {}; 1309d358b2deSVlad Serebrennikov union D {}; 1310d358b2deSVlad Serebrennikov }; 1311d358b2deSVlad Serebrennikov struct E : B {}; 1312d358b2deSVlad Serebrennikov struct F : B::C {}; 1313d358b2deSVlad Serebrennikov 1314d358b2deSVlad Serebrennikov void test() { 1315d358b2deSVlad Serebrennikov cwg90_f(A()); 1316d358b2deSVlad Serebrennikov cwg90_f(B()); 1317d358b2deSVlad Serebrennikov cwg90_f(B::C()); 1318d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'cwg90_f'}} 1319d358b2deSVlad Serebrennikov cwg90_f(B::D()); 1320d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'cwg90_f'}} 1321d358b2deSVlad Serebrennikov cwg90_f(E()); 1322d358b2deSVlad Serebrennikov cwg90_f(F()); 1323d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'cwg90_f'}} 1324d358b2deSVlad Serebrennikov 1325d358b2deSVlad Serebrennikov cwg90_g(A()); 1326d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'cwg90_g'}} 1327d358b2deSVlad Serebrennikov cwg90_g(B()); 1328d358b2deSVlad Serebrennikov cwg90_g(B::C()); 1329d358b2deSVlad Serebrennikov cwg90_g(B::D()); 1330d358b2deSVlad Serebrennikov cwg90_g(E()); 1331d358b2deSVlad Serebrennikov cwg90_g(F()); 1332d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'cwg90_g'}} 1333d358b2deSVlad Serebrennikov } 1334463e61a0SVlad Serebrennikov } // namespace cwg90 1335d358b2deSVlad Serebrennikov 133614ba3f9dSVlad Serebrennikov namespace cwg91 { // cwg91: 2.7 1337d358b2deSVlad Serebrennikov union U { friend int f(U); }; 1338d358b2deSVlad Serebrennikov int k = f(U()); 1339463e61a0SVlad Serebrennikov } // namespace cwg91 1340d358b2deSVlad Serebrennikov 1341d358b2deSVlad Serebrennikov namespace cwg92 { // cwg92: 4 c++17 1342d358b2deSVlad Serebrennikov void f() throw(int, float); 1343d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 1344d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 1345d358b2deSVlad Serebrennikov void (*p)() throw(int) = &f; // #cwg92-p 1346d358b2deSVlad Serebrennikov // since-cxx17-error@#cwg92-p {{ISO C++17 does not allow dynamic exception specifications}} 1347d358b2deSVlad Serebrennikov // since-cxx17-note@#cwg92-p {{use 'noexcept(false)' instead}} 1348d358b2deSVlad Serebrennikov // cxx98-14-error@#cwg92-p {{target exception specification is not superset of source}} 1349d358b2deSVlad Serebrennikov // since-cxx17-warning@#cwg92-p {{target exception specification is not superset of source}} 1350d358b2deSVlad Serebrennikov void (*q)() throw(int); 1351d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 1352d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 1353d358b2deSVlad Serebrennikov void (**pp)() throw() = &q; 1354d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{exception specifications are not allowed beyond a single level of indirection}} 1355d358b2deSVlad Serebrennikov // since-cxx17-error@-2 {{cannot initialize a variable of type 'void (**)() throw()' with an rvalue of type 'void (**)() throw(int)'}} 1356d358b2deSVlad Serebrennikov 1357d358b2deSVlad Serebrennikov void g(void() throw()); // #cwg92-g 1358d358b2deSVlad Serebrennikov // cxx98-14-warning@-1 {{mangled name of 'g' will change in C++17 due to non-throwing exception specification in function signature}} 1359d358b2deSVlad Serebrennikov void h() throw() { 1360d358b2deSVlad Serebrennikov g(f); 1361d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{target exception specification is not superset of source}} 1362d358b2deSVlad Serebrennikov // since-cxx17-error@-2 {{no matching function for call to 'g'}} 1363d358b2deSVlad Serebrennikov // since-cxx17-note@#cwg92-g {{candidate function not viable: no known conversion from 'void () throw(int, float)' to 'void (*)() throw()' for 1st argument}} 1364d358b2deSVlad Serebrennikov g(q); 1365d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{target exception specification is not superset of source}} 1366d358b2deSVlad Serebrennikov // since-cxx17-error@-2 {{no matching function for call to 'g'}} 1367d358b2deSVlad Serebrennikov // since-cxx17-note@#cwg92-g {{candidate function not viable: no known conversion from 'void (*)() throw(int)' to 'void (*)() throw()' for 1st argument}} 1368d358b2deSVlad Serebrennikov } 1369d358b2deSVlad Serebrennikov 1370d358b2deSVlad Serebrennikov // Prior to C++17, this is OK because the exception specification is not 1371d358b2deSVlad Serebrennikov // considered in this context. In C++17, we *do* perform an implicit 1372d358b2deSVlad Serebrennikov // conversion (which performs initialization), and the exception specification 1373d358b2deSVlad Serebrennikov // is part of the type of the parameter, so this is invalid. 1374*e29c0858SMatheus Izvekov template<void() throw()> struct X {}; // since-cxx17-note {{template parameter is declared here}} 1375d358b2deSVlad Serebrennikov X<&f> xp; 1376d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{value of type 'void (*)() throw(int, float)' is not implicitly convertible to 'void (*)() throw()'}} 1377d358b2deSVlad Serebrennikov 1378d358b2deSVlad Serebrennikov template<void() throw(int)> struct Y {}; 1379d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 1380d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 1381d358b2deSVlad Serebrennikov Y<&h> yp; // ok 1382463e61a0SVlad Serebrennikov } // namespace cwg92 1383d358b2deSVlad Serebrennikov 1384d358b2deSVlad Serebrennikov // cwg93: na 1385d358b2deSVlad Serebrennikov 138614ba3f9dSVlad Serebrennikov namespace cwg94 { // cwg94: 2.7 1387d358b2deSVlad Serebrennikov struct A { static const int n = 5; }; 1388d358b2deSVlad Serebrennikov int arr[A::n]; 1389463e61a0SVlad Serebrennikov } // namespace cwg94 1390d358b2deSVlad Serebrennikov 1391d358b2deSVlad Serebrennikov namespace cwg95 { // cwg95: 3.3 1392d358b2deSVlad Serebrennikov struct A; 1393d358b2deSVlad Serebrennikov struct B; 1394d358b2deSVlad Serebrennikov namespace N { 1395d358b2deSVlad Serebrennikov class C { 1396d358b2deSVlad Serebrennikov friend struct A; 1397d358b2deSVlad Serebrennikov friend struct B; 1398d358b2deSVlad Serebrennikov static void f(); // #cwg95-C-f 1399d358b2deSVlad Serebrennikov }; 1400d358b2deSVlad Serebrennikov struct A *p; // cwg95::A, not cwg95::N::A. 1401d358b2deSVlad Serebrennikov } 1402d358b2deSVlad Serebrennikov A *q = N::p; // ok, same type 1403d358b2deSVlad Serebrennikov struct B { void f() { N::C::f(); } }; 1404d358b2deSVlad Serebrennikov // expected-error@-1 {{'f' is a private member of 'cwg95::N::C'}} 1405d358b2deSVlad Serebrennikov // expected-note@#cwg95-C-f {{implicitly declared private here}} 1406463e61a0SVlad Serebrennikov } // namespace cwg95 1407d358b2deSVlad Serebrennikov 1408f46d1463SErick Velez namespace cwg96 { // cwg96: sup P1787 1409d358b2deSVlad Serebrennikov struct A { 1410d358b2deSVlad Serebrennikov void f(int); 1411d358b2deSVlad Serebrennikov template<typename T> int f(T); 1412d358b2deSVlad Serebrennikov template<typename T> struct S {}; 1413d358b2deSVlad Serebrennikov } a; 1414d358b2deSVlad Serebrennikov template<template<typename> class X> struct B {}; 1415d358b2deSVlad Serebrennikov 1416d358b2deSVlad Serebrennikov template<typename T> 1417d358b2deSVlad Serebrennikov void test() { 1418d358b2deSVlad Serebrennikov int k1 = a.template f<int>(0); 1419d358b2deSVlad Serebrennikov // FIXME: This is ill-formed, because 'f' is not a template-id and does not 1420d358b2deSVlad Serebrennikov // name a class template. 1421d358b2deSVlad Serebrennikov // FIXME: What about alias templates? 1422d358b2deSVlad Serebrennikov int k2 = a.template f(1); 1423f46d1463SErick Velez // expected-error@-1 {{a template argument list is expected after a name prefixed by the template keyword}} 1424d358b2deSVlad Serebrennikov A::template S<int> s; 1425d358b2deSVlad Serebrennikov B<A::template S> b; 1426d358b2deSVlad Serebrennikov } 1427463e61a0SVlad Serebrennikov } // namespace cwg96 1428d358b2deSVlad Serebrennikov 142914ba3f9dSVlad Serebrennikov namespace cwg97 { // cwg97: 2.7 1430d358b2deSVlad Serebrennikov struct A { 1431d358b2deSVlad Serebrennikov static const int a = false; 1432d358b2deSVlad Serebrennikov static const int b = !a; 1433d358b2deSVlad Serebrennikov }; 1434463e61a0SVlad Serebrennikov } // namespace cwg97 1435d358b2deSVlad Serebrennikov 143614ba3f9dSVlad Serebrennikov namespace cwg98 { // cwg98: 2.7 1437d358b2deSVlad Serebrennikov void test(int n) { 1438d358b2deSVlad Serebrennikov switch (n) { 1439d358b2deSVlad Serebrennikov try { // #cwg98-try 1440d358b2deSVlad Serebrennikov case 0: 1441d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot jump from switch statement to this case label}} 1442d358b2deSVlad Serebrennikov // expected-note@#cwg98-try {{jump bypasses initialization of try block}} 1443d358b2deSVlad Serebrennikov x: 1444d358b2deSVlad Serebrennikov throw n; 1445d358b2deSVlad Serebrennikov } catch (...) { // #cwg98-catch 1446d358b2deSVlad Serebrennikov case 1: 1447d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot jump from switch statement to this case label}} 1448d358b2deSVlad Serebrennikov // expected-note@#cwg98-catch {{jump bypasses initialization of catch block}} 1449d358b2deSVlad Serebrennikov y: 1450d358b2deSVlad Serebrennikov throw n; 1451d358b2deSVlad Serebrennikov } 1452d358b2deSVlad Serebrennikov case 2: 1453d358b2deSVlad Serebrennikov goto x; 1454d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot jump from this goto statement to its label}} 1455d358b2deSVlad Serebrennikov // expected-note@#cwg98-try {{jump bypasses initialization of try block}} 1456d358b2deSVlad Serebrennikov case 3: 1457d358b2deSVlad Serebrennikov goto y; 1458d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot jump from this goto statement to its label}} 1459d358b2deSVlad Serebrennikov // expected-note@#cwg98-catch {{jump bypasses initialization of catch block}} 1460d358b2deSVlad Serebrennikov } 1461d358b2deSVlad Serebrennikov } 1462463e61a0SVlad Serebrennikov } // namespace cwg98 1463d358b2deSVlad Serebrennikov 1464d358b2deSVlad Serebrennikov namespace cwg99 { // cwg99: sup 214 1465d358b2deSVlad Serebrennikov template<typename T> void f(T&); 1466d358b2deSVlad Serebrennikov template<typename T> int &f(const T&); 1467d358b2deSVlad Serebrennikov const int n = 0; 1468d358b2deSVlad Serebrennikov int &r = f(n); 1469463e61a0SVlad Serebrennikov } // namespace cwg99 1470