1d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++98 %s -verify=expected,cxx98,cxx98-11,cxx98-14,cxx98-17 -fexceptions -fcxx-exceptions -pedantic-errors 2d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++11 %s -verify=expected,since-cxx11,cxx98-11,cxx98-14,cxx98-17 -fexceptions -fcxx-exceptions -pedantic-errors 3d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++14 %s -verify=expected,since-cxx11,since-cxx14,cxx98-14,cxx98-17 -fexceptions -fcxx-exceptions -pedantic-errors 4d358b2deSVlad Serebrennikov // RUN: %clang_cc1 -std=c++17 %s -verify=expected,since-cxx11,since-cxx14,since-cxx17,cxx98-17 -fexceptions -fcxx-exceptions -pedantic-errors 5*10fb5d2bSVlad Serebrennikov // RUN: %clang_cc1 -std=c++20 %s -verify=expected,since-cxx11,since-cxx14,since-cxx17,since-cxx20 -fexceptions -fcxx-exceptions -pedantic-errors 6*10fb5d2bSVlad Serebrennikov // RUN: %clang_cc1 -std=c++23 %s -verify=expected,since-cxx11,since-cxx14,since-cxx17,since-cxx20 -fexceptions -fcxx-exceptions -pedantic-errors 7*10fb5d2bSVlad Serebrennikov // RUN: %clang_cc1 -std=c++2c %s -verify=expected,since-cxx11,since-cxx14,since-cxx17,since-cxx20 -fexceptions -fcxx-exceptions -pedantic-errors 8d358b2deSVlad Serebrennikov 9d358b2deSVlad Serebrennikov // FIXME: diagnostic above is emitted only on Windows platforms 10d358b2deSVlad Serebrennikov // PR13819 -- __SIZE_TYPE__ is incompatible. 11d358b2deSVlad Serebrennikov typedef __SIZE_TYPE__ size_t; 12d358b2deSVlad Serebrennikov // cxx98-error@-1 0-1 {{'long long' is a C++11 extension}} 13d358b2deSVlad Serebrennikov 14d358b2deSVlad Serebrennikov #if __cplusplus == 199711L 15d358b2deSVlad Serebrennikov #define static_assert(...) __extension__ _Static_assert(__VA_ARGS__) 16d358b2deSVlad Serebrennikov // cxx98-error@-1 {{variadic macros are a C99 feature}} 17d358b2deSVlad Serebrennikov #endif 18d358b2deSVlad Serebrennikov 19d358b2deSVlad Serebrennikov #if __cplusplus == 199711L 20d358b2deSVlad Serebrennikov #define __enable_constant_folding(x) (__builtin_constant_p(x) ? (x) : (x)) 21d358b2deSVlad Serebrennikov #else 22d358b2deSVlad Serebrennikov #define __enable_constant_folding 23d358b2deSVlad Serebrennikov #endif 24d358b2deSVlad Serebrennikov 25d358b2deSVlad Serebrennikov namespace cwg200 { // cwg200: dup 214 26d358b2deSVlad Serebrennikov template <class T> T f(int); 27d358b2deSVlad Serebrennikov template <class T, class U> T f(U) = delete; 28d358b2deSVlad Serebrennikov // cxx98-error@-1 {{deleted function definitions are a C++11 extension}} 29d358b2deSVlad Serebrennikov 30d358b2deSVlad Serebrennikov void g() { 31d358b2deSVlad Serebrennikov f<int>(1); 32d358b2deSVlad Serebrennikov } 33463e61a0SVlad Serebrennikov } // namespace cwg200 34d358b2deSVlad Serebrennikov 35d358b2deSVlad Serebrennikov // cwg201 is in cwg201.cpp 36d358b2deSVlad Serebrennikov 37d358b2deSVlad Serebrennikov namespace cwg202 { // cwg202: 3.1 38d358b2deSVlad Serebrennikov template<typename T> T f(); 39d358b2deSVlad Serebrennikov template<int (*g)()> struct X { 40d358b2deSVlad Serebrennikov static_assert(__enable_constant_folding(g == &f<int>), ""); 41d358b2deSVlad Serebrennikov }; 42d358b2deSVlad Serebrennikov template struct X<f>; 43463e61a0SVlad Serebrennikov } // namespace cwg202 44d358b2deSVlad Serebrennikov 45*10fb5d2bSVlad Serebrennikov namespace cwg203 { // cwg203: 3.0 46*10fb5d2bSVlad Serebrennikov namespace ex1 { 47*10fb5d2bSVlad Serebrennikov struct B { 48*10fb5d2bSVlad Serebrennikov int i; 49*10fb5d2bSVlad Serebrennikov }; 50*10fb5d2bSVlad Serebrennikov struct D1 : B {}; 51*10fb5d2bSVlad Serebrennikov struct D2 : B {}; 52*10fb5d2bSVlad Serebrennikov 53*10fb5d2bSVlad Serebrennikov int(D1::*pmD1) = &D2::i; 54*10fb5d2bSVlad Serebrennikov } // namespace ex1 55*10fb5d2bSVlad Serebrennikov 56*10fb5d2bSVlad Serebrennikov #if __cplusplus >= 202002L 57*10fb5d2bSVlad Serebrennikov namespace ex2 { 58*10fb5d2bSVlad Serebrennikov struct A { 59*10fb5d2bSVlad Serebrennikov int i; 60*10fb5d2bSVlad Serebrennikov virtual void f() = 0; // #cwg203-ex2-A-f 61*10fb5d2bSVlad Serebrennikov }; 62*10fb5d2bSVlad Serebrennikov 63*10fb5d2bSVlad Serebrennikov struct B : A { 64*10fb5d2bSVlad Serebrennikov int j; 65*10fb5d2bSVlad Serebrennikov constexpr B() : j(5) {} 66*10fb5d2bSVlad Serebrennikov virtual void f(); 67*10fb5d2bSVlad Serebrennikov }; 68*10fb5d2bSVlad Serebrennikov 69*10fb5d2bSVlad Serebrennikov struct C : B { 70*10fb5d2bSVlad Serebrennikov constexpr C() { j = 10; } 71*10fb5d2bSVlad Serebrennikov }; 72*10fb5d2bSVlad Serebrennikov 73*10fb5d2bSVlad Serebrennikov template <class T> 74*10fb5d2bSVlad Serebrennikov constexpr int DefaultValue(int(T::*m)) { 75*10fb5d2bSVlad Serebrennikov return T().*m; 76*10fb5d2bSVlad Serebrennikov // since-cxx20-error@-1 {{allocating an object of abstract class type 'cwg203::ex2::A'}} 77*10fb5d2bSVlad Serebrennikov // since-cxx20-note@#cwg203-ex2-a {{in instantiation of function template specialization 'cwg203::ex2::DefaultValue<cwg203::ex2::A>' requested here}} 78*10fb5d2bSVlad Serebrennikov // since-cxx20-note@#cwg203-ex2-A-f {{unimplemented pure virtual method 'f' in 'A'}} 79*10fb5d2bSVlad Serebrennikov } // #cwg203-ex2-DefaultValue 80*10fb5d2bSVlad Serebrennikov 81*10fb5d2bSVlad Serebrennikov int a = DefaultValue(&B::i); // #cwg203-ex2-a 82*10fb5d2bSVlad Serebrennikov static_assert(DefaultValue(&C::j) == 5, ""); 83*10fb5d2bSVlad Serebrennikov } // namespace ex2 84*10fb5d2bSVlad Serebrennikov #endif 85*10fb5d2bSVlad Serebrennikov 86*10fb5d2bSVlad Serebrennikov namespace ex3 { 87*10fb5d2bSVlad Serebrennikov class Base { 88*10fb5d2bSVlad Serebrennikov public: 89*10fb5d2bSVlad Serebrennikov int func() const; 90*10fb5d2bSVlad Serebrennikov }; 91*10fb5d2bSVlad Serebrennikov 92*10fb5d2bSVlad Serebrennikov class Derived : public Base {}; 93*10fb5d2bSVlad Serebrennikov 94*10fb5d2bSVlad Serebrennikov template <class T> class Templ { // #cwg203-ex3-Templ 95*10fb5d2bSVlad Serebrennikov public: 96*10fb5d2bSVlad Serebrennikov template <class S> Templ(S (T::*ptmf)() const); // #cwg203-ex3-Templ-ctor 97*10fb5d2bSVlad Serebrennikov }; 98*10fb5d2bSVlad Serebrennikov 99*10fb5d2bSVlad Serebrennikov void foo() { Templ<Derived> x(&Derived::func); } 100*10fb5d2bSVlad Serebrennikov // expected-error@-1 {{no matching constructor for initialization of 'Templ<Derived>'}} 101*10fb5d2bSVlad Serebrennikov // expected-note@#cwg203-ex3-Templ {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int (cwg203::ex3::Base::*)() const' to 'const Templ<Derived>' for 1st argument}} 102*10fb5d2bSVlad Serebrennikov // since-cxx11-note@#cwg203-ex3-Templ {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int (cwg203::ex3::Base::*)() const' to 'Templ<Derived>' for 1st argument}} 103*10fb5d2bSVlad Serebrennikov // expected-note@#cwg203-ex3-Templ-ctor {{candidate template ignored: could not match 'cwg203::ex3::Derived' against 'cwg203::ex3::Base'}} 104*10fb5d2bSVlad Serebrennikov } // namespace ex3 105*10fb5d2bSVlad Serebrennikov 106*10fb5d2bSVlad Serebrennikov namespace ex4 { 107*10fb5d2bSVlad Serebrennikov struct Very_base { 108*10fb5d2bSVlad Serebrennikov int a; 109*10fb5d2bSVlad Serebrennikov }; 110*10fb5d2bSVlad Serebrennikov struct Base1 : Very_base {}; 111*10fb5d2bSVlad Serebrennikov struct Base2 : Very_base {}; 112*10fb5d2bSVlad Serebrennikov struct Derived : Base1, Base2 { 113*10fb5d2bSVlad Serebrennikov }; 114*10fb5d2bSVlad Serebrennikov 115*10fb5d2bSVlad Serebrennikov int f() { 116*10fb5d2bSVlad Serebrennikov Derived d; 117*10fb5d2bSVlad Serebrennikov // FIXME: in the diagnostic below, Very_base is fully qualified, but Derived is not 118*10fb5d2bSVlad Serebrennikov int Derived::*a_ptr = &Derived::Base1::a; 119*10fb5d2bSVlad Serebrennikov /* expected-error@-1 120*10fb5d2bSVlad Serebrennikov {{ambiguous conversion from pointer to member of base class 'cwg203::ex4::Very_base' to pointer to member of derived class 'Derived': 121*10fb5d2bSVlad Serebrennikov struct cwg203::ex4::Derived -> Base1 -> Very_base 122*10fb5d2bSVlad Serebrennikov struct cwg203::ex4::Derived -> Base2 -> Very_base}}*/ 123*10fb5d2bSVlad Serebrennikov } 124*10fb5d2bSVlad Serebrennikov } // namespace ex4 125*10fb5d2bSVlad Serebrennikov 126*10fb5d2bSVlad Serebrennikov namespace ex5 { 127*10fb5d2bSVlad Serebrennikov struct Base { 128*10fb5d2bSVlad Serebrennikov int a; 129*10fb5d2bSVlad Serebrennikov }; 130*10fb5d2bSVlad Serebrennikov struct Derived : Base { 131*10fb5d2bSVlad Serebrennikov int b; 132*10fb5d2bSVlad Serebrennikov }; 133*10fb5d2bSVlad Serebrennikov 134*10fb5d2bSVlad Serebrennikov template <typename Class, typename Member_type, Member_type Base::*ptr> 135*10fb5d2bSVlad Serebrennikov Member_type get(Class &c) { 136*10fb5d2bSVlad Serebrennikov return c.*ptr; 137*10fb5d2bSVlad Serebrennikov } 138*10fb5d2bSVlad Serebrennikov 139*10fb5d2bSVlad Serebrennikov void call(int (*f)(Derived &)); // #cwg203-ex5-call 140*10fb5d2bSVlad Serebrennikov 141*10fb5d2bSVlad Serebrennikov int f() { 142*10fb5d2bSVlad Serebrennikov // ill-formed, contrary to Core issue filing: 143*10fb5d2bSVlad Serebrennikov // `&Derived::b` yields `int Derived::*`, which can't initialize NTTP of type `int Base::*`, 144*10fb5d2bSVlad Serebrennikov // because (implicit) pointer-to-member conversion doesn't upcast. 145*10fb5d2bSVlad Serebrennikov call(&get<Derived, int, &Derived::b>); 146*10fb5d2bSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'call'}} 147*10fb5d2bSVlad Serebrennikov // expected-note@#cwg203-ex5-call {{candidate function not viable: no overload of 'get' matching 'int (*)(Derived &)' for 1st argument}} 148*10fb5d2bSVlad Serebrennikov 149*10fb5d2bSVlad Serebrennikov // well-formed, contrary to Core issue filing: 150*10fb5d2bSVlad Serebrennikov // `&Derived::a` yields `int Base::*`, 151*10fb5d2bSVlad Serebrennikov // which can initialize NTTP of type `int Base::*`. 152*10fb5d2bSVlad Serebrennikov call(&get<Derived, int, &Derived::a>); 153*10fb5d2bSVlad Serebrennikov 154*10fb5d2bSVlad Serebrennikov call(&get<Base, int, &Derived::a>); 155*10fb5d2bSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'call'}} 156*10fb5d2bSVlad Serebrennikov // expected-note@#cwg203-ex5-call {{candidate function not viable: no overload of 'get' matching 'int (*)(Derived &)' for 1st argument}} 157*10fb5d2bSVlad Serebrennikov } 158*10fb5d2bSVlad Serebrennikov } // namespace ex5 159*10fb5d2bSVlad Serebrennikov 160*10fb5d2bSVlad Serebrennikov namespace ex6 { 161*10fb5d2bSVlad Serebrennikov struct Base { 162*10fb5d2bSVlad Serebrennikov int a; 163*10fb5d2bSVlad Serebrennikov }; 164*10fb5d2bSVlad Serebrennikov struct Derived : private Base { // #cwg203-ex6-Derived 165*10fb5d2bSVlad Serebrennikov public: 166*10fb5d2bSVlad Serebrennikov using Base::a; // make `a` accessible 167*10fb5d2bSVlad Serebrennikov }; 168*10fb5d2bSVlad Serebrennikov 169*10fb5d2bSVlad Serebrennikov int f() { 170*10fb5d2bSVlad Serebrennikov Derived d; 171*10fb5d2bSVlad Serebrennikov int b = d.a; 172*10fb5d2bSVlad Serebrennikov // FIXME: in the diagnostic below, Base is fully qualified, but Derived is not 173*10fb5d2bSVlad Serebrennikov int Derived::*ptr = &Derived::a; 174*10fb5d2bSVlad Serebrennikov // expected-error@-1 {{cannot cast private base class 'cwg203::ex6::Base' to 'Derived'}} 175*10fb5d2bSVlad Serebrennikov // expected-note@#cwg203-ex6-Derived {{declared private here}} 176*10fb5d2bSVlad Serebrennikov } 177*10fb5d2bSVlad Serebrennikov } // namespace ex6 178*10fb5d2bSVlad Serebrennikov } // namespace cwg203 179*10fb5d2bSVlad Serebrennikov 180aed98915SVlad Serebrennikov // cwg204: sup 820 181d358b2deSVlad Serebrennikov 18214ba3f9dSVlad Serebrennikov namespace cwg206 { // cwg206: 2.7 183d358b2deSVlad Serebrennikov struct S; // #cwg206-S 184d358b2deSVlad Serebrennikov template<typename T> struct Q { S s; }; 185d358b2deSVlad Serebrennikov // expected-error@-1 {{field has incomplete type 'S'}} 186d358b2deSVlad Serebrennikov // expected-note@#cwg206-S {{forward declaration of 'cwg206::S'}} 187d358b2deSVlad Serebrennikov template<typename T> void f() { S s; } 188d358b2deSVlad Serebrennikov // expected-error@-1 {{variable has incomplete type 'S'}} 189d358b2deSVlad Serebrennikov // expected-note@#cwg206-S {{forward declaration of 'cwg206::S'}} 190463e61a0SVlad Serebrennikov } // namespace cwg206 191d358b2deSVlad Serebrennikov 19214ba3f9dSVlad Serebrennikov namespace cwg207 { // cwg207: 2.7 193d358b2deSVlad Serebrennikov class A { 194d358b2deSVlad Serebrennikov protected: 195d358b2deSVlad Serebrennikov static void f() {} 196d358b2deSVlad Serebrennikov }; 197d358b2deSVlad Serebrennikov class B : A { 198d358b2deSVlad Serebrennikov public: 199d358b2deSVlad Serebrennikov using A::f; 200d358b2deSVlad Serebrennikov void g() { 201d358b2deSVlad Serebrennikov A::f(); 202d358b2deSVlad Serebrennikov f(); 203d358b2deSVlad Serebrennikov } 204d358b2deSVlad Serebrennikov }; 205463e61a0SVlad Serebrennikov } // namespace cwg207 206d358b2deSVlad Serebrennikov 207d358b2deSVlad Serebrennikov // cwg208 FIXME: write codegen test 208d358b2deSVlad Serebrennikov 209d358b2deSVlad Serebrennikov namespace cwg209 { // cwg209: 3.2 210d358b2deSVlad Serebrennikov class A { 211d358b2deSVlad Serebrennikov void f(); // #cwg209-A-f 212d358b2deSVlad Serebrennikov }; 213d358b2deSVlad Serebrennikov class B { 214d358b2deSVlad Serebrennikov friend void A::f(); 215d358b2deSVlad Serebrennikov // expected-error@-1 {{friend function 'f' is a private member of 'cwg209::A'}} 216d358b2deSVlad Serebrennikov // expected-note@#cwg209-A-f {{implicitly declared private here}} 217d358b2deSVlad Serebrennikov }; 218463e61a0SVlad Serebrennikov } // namespace cwg209 219d358b2deSVlad Serebrennikov 220d358b2deSVlad Serebrennikov // cwg210 is in cwg210.cpp 221d358b2deSVlad Serebrennikov 22214ba3f9dSVlad Serebrennikov namespace cwg211 { // cwg211: 2.7 223d358b2deSVlad Serebrennikov struct A { 224d358b2deSVlad Serebrennikov A() try { 225d358b2deSVlad Serebrennikov throw 0; 226d358b2deSVlad Serebrennikov } catch (...) { 227d358b2deSVlad Serebrennikov return; 228d358b2deSVlad Serebrennikov // expected-error@-1 {{return in the catch of a function try block of a constructor is illegal}} 229d358b2deSVlad Serebrennikov } 230d358b2deSVlad Serebrennikov }; 231463e61a0SVlad Serebrennikov } // namespace cwg211 232d358b2deSVlad Serebrennikov 23314ba3f9dSVlad Serebrennikov namespace cwg213 { // cwg213: 2.7 234d358b2deSVlad Serebrennikov template <class T> struct A : T { 235d358b2deSVlad Serebrennikov void h(T t) { 236d358b2deSVlad Serebrennikov char &r1 = f(t); 237d358b2deSVlad Serebrennikov int &r2 = g(t); 238d358b2deSVlad Serebrennikov // expected-error@-1 {{explicit qualification required to use member 'g' from dependent base class}} 239d358b2deSVlad Serebrennikov // expected-note@#cwg213-instantiation {{in instantiation of member function 'cwg213::A<cwg213::B>::h' requested here}} 240d358b2deSVlad Serebrennikov // expected-note@#cwg213-B-g {{member is declared here}} 241d358b2deSVlad Serebrennikov } 242d358b2deSVlad Serebrennikov }; 243d358b2deSVlad Serebrennikov struct B { 244d358b2deSVlad Serebrennikov int &f(B); 245d358b2deSVlad Serebrennikov int &g(B); // #cwg213-B-g 246d358b2deSVlad Serebrennikov }; 247d358b2deSVlad Serebrennikov char &f(B); 248d358b2deSVlad Serebrennikov 249d358b2deSVlad Serebrennikov template void A<B>::h(B); // #cwg213-instantiation 250463e61a0SVlad Serebrennikov } // namespace cwg213 251d358b2deSVlad Serebrennikov 25214ba3f9dSVlad Serebrennikov namespace cwg214 { // cwg214: 2.7 253d358b2deSVlad Serebrennikov template<typename T, typename U> T checked_cast(U from) { U::error; } 254d358b2deSVlad Serebrennikov template<typename T, typename U> T checked_cast(U *from); 255d358b2deSVlad Serebrennikov class C {}; 256d358b2deSVlad Serebrennikov void foo(int *arg) { checked_cast<const C *>(arg); } 257d358b2deSVlad Serebrennikov 258d358b2deSVlad Serebrennikov template<typename T> T f(int); 259d358b2deSVlad Serebrennikov template<typename T, typename U> T f(U) { T::error; } 260d358b2deSVlad Serebrennikov void g() { 261d358b2deSVlad Serebrennikov f<int>(1); 262d358b2deSVlad Serebrennikov } 263463e61a0SVlad Serebrennikov } // namespace cwg214 264d358b2deSVlad Serebrennikov 265d358b2deSVlad Serebrennikov namespace cwg215 { // cwg215: 2.9 266d358b2deSVlad Serebrennikov template<typename T> class X { 267d358b2deSVlad Serebrennikov friend void T::foo(); 268d358b2deSVlad Serebrennikov int n; 269d358b2deSVlad Serebrennikov }; 270d358b2deSVlad Serebrennikov struct Y { 271d358b2deSVlad Serebrennikov void foo() { (void)+X<Y>().n; } 272d358b2deSVlad Serebrennikov }; 273463e61a0SVlad Serebrennikov } // namespace cwg215 274d358b2deSVlad Serebrennikov 275d358b2deSVlad Serebrennikov namespace cwg216 { // cwg216: no 276d358b2deSVlad Serebrennikov // FIXME: Should reject this: 'f' has linkage but its type does not, 277d358b2deSVlad Serebrennikov // and 'f' is odr-used but not defined in this TU. 278d358b2deSVlad Serebrennikov typedef enum { e } *E; 279d358b2deSVlad Serebrennikov void f(E); 280d358b2deSVlad Serebrennikov void g(E e) { f(e); } 281d358b2deSVlad Serebrennikov 282d358b2deSVlad Serebrennikov struct S { 283d358b2deSVlad Serebrennikov // FIXME: Should reject this: 'f' has linkage but its type does not, 284d358b2deSVlad Serebrennikov // and 'f' is odr-used but not defined in this TU. 285d358b2deSVlad Serebrennikov typedef enum { e } *E; 286d358b2deSVlad Serebrennikov void f(E); 287d358b2deSVlad Serebrennikov }; 288d358b2deSVlad Serebrennikov void g(S s, S::E e) { s.f(e); } 289463e61a0SVlad Serebrennikov } // namespace cwg216 290d358b2deSVlad Serebrennikov 29114ba3f9dSVlad Serebrennikov namespace cwg217 { // cwg217: 2.7 292d358b2deSVlad Serebrennikov template<typename T> struct S { 293d358b2deSVlad Serebrennikov void f(int); 294d358b2deSVlad Serebrennikov }; 295d358b2deSVlad Serebrennikov template<typename T> void S<T>::f(int = 0) {} 296d358b2deSVlad Serebrennikov // expected-error@-1 {{default arguments cannot be added to an out-of-line definition of a member of a class template}} 297463e61a0SVlad Serebrennikov } // namespace cwg217 298d358b2deSVlad Serebrennikov 29914ba3f9dSVlad Serebrennikov namespace cwg218 { // cwg218: 2.7 300d358b2deSVlad Serebrennikov // NB: also dup 405 301d358b2deSVlad Serebrennikov namespace A { 302d358b2deSVlad Serebrennikov struct S {}; 303d358b2deSVlad Serebrennikov void f(S); 304d358b2deSVlad Serebrennikov } 305d358b2deSVlad Serebrennikov namespace B { 306d358b2deSVlad Serebrennikov struct S {}; 307d358b2deSVlad Serebrennikov void f(S); 308d358b2deSVlad Serebrennikov } 309d358b2deSVlad Serebrennikov 310d358b2deSVlad Serebrennikov struct C { 311d358b2deSVlad Serebrennikov int f; 312d358b2deSVlad Serebrennikov void test1(A::S as) { f(as); } 313d358b2deSVlad Serebrennikov // expected-error@-1 {{called object type 'int' is not a function or function pointer}} 314d358b2deSVlad Serebrennikov void test2(A::S as) { void f(); f(as); } 315d358b2deSVlad Serebrennikov // expected-error@-1 {{too many arguments to function call, expected 0, have 1}} 316d358b2deSVlad Serebrennikov // expected-note@-2 {{'f' declared here}} 317d358b2deSVlad Serebrennikov void test3(A::S as) { using A::f; f(as); } // ok 318d358b2deSVlad Serebrennikov void test4(A::S as) { using B::f; f(as); } // ok 319d358b2deSVlad Serebrennikov void test5(A::S as) { int f; f(as); } 320d358b2deSVlad Serebrennikov // expected-error@-1 {{called object type 'int' is not a function or function pointer}} 321d358b2deSVlad Serebrennikov void test6(A::S as) { struct f {}; (void) f(as); } 322d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching conversion for functional-style cast from 'A::S' to 'f'}} 323d358b2deSVlad Serebrennikov // expected-note@-2 {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'A::S' to 'const f' for 1st argument}} 324d358b2deSVlad Serebrennikov // since-cxx11-note@-3 {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'A::S' to 'f' for 1st argument}} 325d358b2deSVlad Serebrennikov // expected-note@-4 {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} 326d358b2deSVlad Serebrennikov }; 327d358b2deSVlad Serebrennikov 328d358b2deSVlad Serebrennikov namespace D { 329d358b2deSVlad Serebrennikov struct S {}; 330d358b2deSVlad Serebrennikov struct X { void operator()(S); } f; 331d358b2deSVlad Serebrennikov } 332d358b2deSVlad Serebrennikov void testD(D::S ds) { f(ds); } 333d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'f'}} 334d358b2deSVlad Serebrennikov 335d358b2deSVlad Serebrennikov namespace E { 336d358b2deSVlad Serebrennikov struct S {}; 337d358b2deSVlad Serebrennikov struct f { f(S); }; 338d358b2deSVlad Serebrennikov } 339d358b2deSVlad Serebrennikov void testE(E::S es) { f(es); } 340d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'f'}} 341d358b2deSVlad Serebrennikov 342d358b2deSVlad Serebrennikov namespace F { 343d358b2deSVlad Serebrennikov struct S { 344d358b2deSVlad Serebrennikov template<typename T> friend void f(S, T) {} 345d358b2deSVlad Serebrennikov }; 346d358b2deSVlad Serebrennikov } 347d358b2deSVlad Serebrennikov void testF(F::S fs) { f(fs, 0); } 348d358b2deSVlad Serebrennikov 349d358b2deSVlad Serebrennikov namespace G { 350d358b2deSVlad Serebrennikov namespace X { 351d358b2deSVlad Serebrennikov int f; 352d358b2deSVlad Serebrennikov struct A {}; 353d358b2deSVlad Serebrennikov } 354d358b2deSVlad Serebrennikov namespace Y { 355d358b2deSVlad Serebrennikov template<typename T> void f(T); 356d358b2deSVlad Serebrennikov struct B {}; 357d358b2deSVlad Serebrennikov } 358d358b2deSVlad Serebrennikov template<typename A, typename B> struct C {}; 359d358b2deSVlad Serebrennikov } 360d358b2deSVlad Serebrennikov void testG(G::C<G::X::A, G::Y::B> gc) { f(gc); } 361463e61a0SVlad Serebrennikov } // namespace cwg218 362d358b2deSVlad Serebrennikov 363d358b2deSVlad Serebrennikov // cwg219: na 364d358b2deSVlad Serebrennikov // cwg220: na 365d358b2deSVlad Serebrennikov 366d358b2deSVlad Serebrennikov namespace cwg221 { // cwg221: 3.6 367d358b2deSVlad Serebrennikov struct A { // #cwg221-S 368d358b2deSVlad Serebrennikov A &operator=(int&); // #cwg221-S-copy-assign 369d358b2deSVlad Serebrennikov A &operator+=(int&); 370d358b2deSVlad Serebrennikov static A &operator=(A&, double&); 371d358b2deSVlad Serebrennikov // expected-error@-1 {{overloaded 'operator=' cannot be a static member function}} 372d358b2deSVlad Serebrennikov static A &operator+=(A&, double&); 373d358b2deSVlad Serebrennikov // expected-error@-1 {{overloaded 'operator+=' cannot be a static member function}} 374d358b2deSVlad Serebrennikov friend A &operator=(A&, char&); 375d358b2deSVlad Serebrennikov // expected-error@-1 {{overloaded 'operator=' must be a non-static member function}} 376d358b2deSVlad Serebrennikov friend A &operator+=(A&, char&); 377d358b2deSVlad Serebrennikov }; 378d358b2deSVlad Serebrennikov A &operator=(A&, float&); 379d358b2deSVlad Serebrennikov // expected-error@-1 {{overloaded 'operator=' must be a non-static member function}} 380d358b2deSVlad Serebrennikov A &operator+=(A&, float&); 381d358b2deSVlad Serebrennikov 382d358b2deSVlad Serebrennikov void test(A a, int n, char c, float f) { 383d358b2deSVlad Serebrennikov a = n; 384d358b2deSVlad Serebrennikov a += n; 385d358b2deSVlad Serebrennikov a = c; 386d358b2deSVlad Serebrennikov // expected-error@-1 {{no viable overloaded '='}} 387d358b2deSVlad Serebrennikov // expected-note@#cwg221-S-copy-assign {{candidate function not viable: no known conversion from 'char' to 'int &' for 1st argument}} 388d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg221-S {{candidate function (the implicit move assignment operator) not viable: no known conversion from 'char' to 'A' for 1st argument}} 389d358b2deSVlad Serebrennikov // expected-note@#cwg221-S {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'char' to 'const A' for 1st argument}} 390d358b2deSVlad Serebrennikov a += c; 391d358b2deSVlad Serebrennikov a = f; 392d358b2deSVlad Serebrennikov // expected-error@-1 {{no viable overloaded '='}} 393d358b2deSVlad Serebrennikov // expected-note@#cwg221-S-copy-assign {{candidate function not viable: no known conversion from 'float' to 'int &' for 1st argument}} 394d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg221-S {{candidate function (the implicit move assignment operator) not viable: no known conversion from 'float' to 'A' for 1st argument}} 395d358b2deSVlad Serebrennikov // expected-note@#cwg221-S {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'float' to 'const A' for 1st argument}} 396d358b2deSVlad Serebrennikov a += f; 397d358b2deSVlad Serebrennikov } 398463e61a0SVlad Serebrennikov } // namespace cwg221 399d358b2deSVlad Serebrennikov 400d358b2deSVlad Serebrennikov namespace cwg222 { // cwg222: dup 637 401d358b2deSVlad Serebrennikov void f(int a, int b, int c, int *x) { 402d358b2deSVlad Serebrennikov #pragma clang diagnostic push 403d358b2deSVlad Serebrennikov #pragma clang diagnostic warning "-Wunsequenced" 404d358b2deSVlad Serebrennikov void((a += b) += c); 405d358b2deSVlad Serebrennikov void((a += b) + (a += c)); 406d358b2deSVlad Serebrennikov // expected-warning@-1 {{multiple unsequenced modifications to 'a'}} 407d358b2deSVlad Serebrennikov 408d358b2deSVlad Serebrennikov x[a++] = a; 409d358b2deSVlad Serebrennikov // cxx98-14-warning@-1 {{unsequenced modification and access to 'a'}} 410d358b2deSVlad Serebrennikov 411d358b2deSVlad Serebrennikov a = b = 0; // ok, read and write of 'b' are sequenced 412d358b2deSVlad Serebrennikov 413d358b2deSVlad Serebrennikov a = (b = a++); 414d358b2deSVlad Serebrennikov // cxx98-14-warning@-1 {{multiple unsequenced modifications to 'a'}} 415d358b2deSVlad Serebrennikov a = (b = ++a); 416d358b2deSVlad Serebrennikov #pragma clang diagnostic pop 417d358b2deSVlad Serebrennikov } 418463e61a0SVlad Serebrennikov } // namespace cwg222 419d358b2deSVlad Serebrennikov 420d358b2deSVlad Serebrennikov // cwg223: na 421d358b2deSVlad Serebrennikov 422d358b2deSVlad Serebrennikov namespace cwg224 { // cwg224: 16 423d358b2deSVlad Serebrennikov namespace example1 { 424d358b2deSVlad Serebrennikov template <class T> class A { 425d358b2deSVlad Serebrennikov typedef int type; 426d358b2deSVlad Serebrennikov A::type a; 427d358b2deSVlad Serebrennikov A<T>::type b; 428d358b2deSVlad Serebrennikov A<T*>::type c; 429d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name A<T *>::type; implicit 'typename' is a C++20 extension}} 430d358b2deSVlad Serebrennikov ::cwg224::example1::A<T>::type d; 431d358b2deSVlad Serebrennikov 432d358b2deSVlad Serebrennikov class B { 433d358b2deSVlad Serebrennikov typedef int type; 434d358b2deSVlad Serebrennikov 435d358b2deSVlad Serebrennikov A::type a; 436d358b2deSVlad Serebrennikov A<T>::type b; 437d358b2deSVlad Serebrennikov A<T*>::type c; 438d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name A<T *>::type; implicit 'typename' is a C++20 extension}} 439d358b2deSVlad Serebrennikov ::cwg224::example1::A<T>::type d; 440d358b2deSVlad Serebrennikov 441d358b2deSVlad Serebrennikov B::type e; 442d358b2deSVlad Serebrennikov A<T>::B::type f; 443d358b2deSVlad Serebrennikov A<T*>::B::type g; 444d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name A<T *>::B::type; implicit 'typename' is a C++20 extension}} 445d358b2deSVlad Serebrennikov typename A<T*>::B::type h; 446d358b2deSVlad Serebrennikov }; 447d358b2deSVlad Serebrennikov }; 448d358b2deSVlad Serebrennikov 449d358b2deSVlad Serebrennikov template <class T> class A<T*> { 450d358b2deSVlad Serebrennikov typedef int type; 451d358b2deSVlad Serebrennikov A<T*>::type a; 452d358b2deSVlad Serebrennikov A<T>::type b; 453d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name A<T>::type; implicit 'typename' is a C++20 extension}} 454d358b2deSVlad Serebrennikov }; 455d358b2deSVlad Serebrennikov 456d358b2deSVlad Serebrennikov template <class T1, class T2, int I> struct B { 457d358b2deSVlad Serebrennikov typedef int type; 458d358b2deSVlad Serebrennikov B<T1, T2, I>::type b1; 459d358b2deSVlad Serebrennikov B<T2, T1, I>::type b2; 460d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name B<T2, T1, I>::type; implicit 'typename' is a C++20 extension}} 461d358b2deSVlad Serebrennikov 462d358b2deSVlad Serebrennikov typedef T1 my_T1; 463d358b2deSVlad Serebrennikov static const int my_I = I; 464d358b2deSVlad Serebrennikov static const int my_I2 = I+0; 465d358b2deSVlad Serebrennikov static const int my_I3 = my_I; 466d358b2deSVlad Serebrennikov B<my_T1, T2, my_I>::type b3; 467d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name B<my_T1, T2, my_I>::type; implicit 'typename' is a C++20 extension}} 468d358b2deSVlad Serebrennikov B<my_T1, T2, my_I2>::type b4; 469d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name B<my_T1, T2, my_I2>::type; implicit 'typename' is a C++20 extension}} 470d358b2deSVlad Serebrennikov B<my_T1, T2, my_I3>::type b5; 471d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name B<my_T1, T2, my_I3>::type; implicit 'typename' is a C++20 extension}} 472d358b2deSVlad Serebrennikov }; 473d358b2deSVlad Serebrennikov } 474d358b2deSVlad Serebrennikov 475d358b2deSVlad Serebrennikov namespace example2 { 476d358b2deSVlad Serebrennikov template <int, typename T> struct X { typedef T type; }; 477d358b2deSVlad Serebrennikov template <class T> class A { 478d358b2deSVlad Serebrennikov static const int i = 5; 479d358b2deSVlad Serebrennikov X<i, int>::type w; 480d358b2deSVlad Serebrennikov X<A::i, char>::type x; 481d358b2deSVlad Serebrennikov X<A<T>::i, double>::type y; 482d358b2deSVlad Serebrennikov X<A<T*>::i, long>::type z; 483d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{missing 'typename' prior to dependent type name X<A<T *>::i, long>::type; implicit 'typename' is a C++20 extension}} 484d358b2deSVlad Serebrennikov int f(); 485d358b2deSVlad Serebrennikov }; 486d358b2deSVlad Serebrennikov template <class T> int A<T>::f() { 487d358b2deSVlad Serebrennikov return i; 488d358b2deSVlad Serebrennikov } 489d358b2deSVlad Serebrennikov } 490463e61a0SVlad Serebrennikov } // namespace cwg224 491d358b2deSVlad Serebrennikov 492d358b2deSVlad Serebrennikov // cwg225: yes 493d358b2deSVlad Serebrennikov template<typename T> void cwg225_f(T t) { cwg225_g(t); } 494d358b2deSVlad Serebrennikov // expected-error@-1 {{call to function 'cwg225_g' that is neither visible in the template definition nor found by argument-dependent lookup}} 495d358b2deSVlad Serebrennikov // expected-note@#cwg225-f {{in instantiation of function template specialization 'cwg225_f<int>' requested here}} 496d358b2deSVlad Serebrennikov // expected-note@#cwg225-g {{'cwg225_g' should be declared prior to the call site}} 497d358b2deSVlad Serebrennikov void cwg225_g(int); // #cwg225-g 498d358b2deSVlad Serebrennikov template void cwg225_f(int); // #cwg225-f 499d358b2deSVlad Serebrennikov 500d358b2deSVlad Serebrennikov namespace cwg226 { // cwg226: no 501d358b2deSVlad Serebrennikov // FIXME: This appears to be wrong: default arguments for function templates 502d358b2deSVlad Serebrennikov // are listed as a defect (in c++98) not an extension. EDG accepts them in 503d358b2deSVlad Serebrennikov // strict c++98 mode. 504d358b2deSVlad Serebrennikov template<typename T = void> void f() {} 505d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 506d358b2deSVlad Serebrennikov template<typename T> struct S { 507d358b2deSVlad Serebrennikov template<typename U = void> void g(); 508d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 509d358b2deSVlad Serebrennikov template<typename U> struct X; 510d358b2deSVlad Serebrennikov template<typename U> void h(); 511d358b2deSVlad Serebrennikov }; 512d358b2deSVlad Serebrennikov template<typename T> template<typename U> void S<T>::g() {} 513d358b2deSVlad Serebrennikov template<typename T> template<typename U = void> struct S<T>::X {}; 514d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot add a default template argument to the definition of a member of a class template}} 515d358b2deSVlad Serebrennikov template<typename T> template<typename U = void> void S<T>::h() {} 516d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot add a default template argument to the definition of a member of a class template}} 517d358b2deSVlad Serebrennikov 518d358b2deSVlad Serebrennikov template<typename> void friend_h(); 519d358b2deSVlad Serebrennikov struct A { 520d358b2deSVlad Serebrennikov // FIXME: This is ill-formed. 521d358b2deSVlad Serebrennikov template<typename=void> struct friend_B; 522d358b2deSVlad Serebrennikov // FIXME: f, h, and i are ill-formed. 523d358b2deSVlad Serebrennikov // f is ill-formed because it is not a definition. 524d358b2deSVlad Serebrennikov // h and i are ill-formed because they are not the only declarations of the 525d358b2deSVlad Serebrennikov // function in the translation unit. 526d358b2deSVlad Serebrennikov template<typename=void> void friend_f(); 527d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 528d358b2deSVlad Serebrennikov template<typename=void> void friend_g() {} 529d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 530d358b2deSVlad Serebrennikov template<typename=void> void friend_h() {} 531d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 532d358b2deSVlad Serebrennikov template<typename=void> void friend_i() {} 533d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 534d358b2deSVlad Serebrennikov }; 535d358b2deSVlad Serebrennikov template<typename> void friend_i(); 536d358b2deSVlad Serebrennikov 537d358b2deSVlad Serebrennikov template<typename=void, typename X> void foo(X) {} 538d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 539d358b2deSVlad Serebrennikov template<typename=void, typename X> struct Foo {}; 540d358b2deSVlad Serebrennikov // expected-error@-1 {{template parameter missing a default argument}} 541d358b2deSVlad Serebrennikov // expected-note@-2 {{previous default template argument defined here}} 542d358b2deSVlad Serebrennikov 543d358b2deSVlad Serebrennikov template<typename=void, typename X, typename, typename Y> int foo(X, Y); 544d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 545d358b2deSVlad Serebrennikov template<typename, typename X, typename=void, typename Y> int foo(X, Y); 546d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 547d358b2deSVlad Serebrennikov int x = foo(0, 0); 548463e61a0SVlad Serebrennikov } // namespace cwg226 549d358b2deSVlad Serebrennikov 55014ba3f9dSVlad Serebrennikov namespace cwg227 { // cwg227: 2.7 55114ba3f9dSVlad Serebrennikov void f(bool b) { 552d358b2deSVlad Serebrennikov if (b) 553d358b2deSVlad Serebrennikov int n; 554d358b2deSVlad Serebrennikov else 555d358b2deSVlad Serebrennikov int n; 556d358b2deSVlad Serebrennikov } 55714ba3f9dSVlad Serebrennikov } // namespace cwg227 558d358b2deSVlad Serebrennikov 55914ba3f9dSVlad Serebrennikov namespace cwg228 { // cwg228: 2.7 560d358b2deSVlad Serebrennikov template <class T> struct X { 561d358b2deSVlad Serebrennikov void f(); 562d358b2deSVlad Serebrennikov }; 563d358b2deSVlad Serebrennikov template <class T> struct Y { 564d358b2deSVlad Serebrennikov void g(X<T> x) { x.template X<T>::f(); } 565d358b2deSVlad Serebrennikov }; 566463e61a0SVlad Serebrennikov } // namespace cwg228 567d358b2deSVlad Serebrennikov 568d358b2deSVlad Serebrennikov namespace cwg229 { // cwg229: 2.9 569d358b2deSVlad Serebrennikov template<typename T> void f(); 570d358b2deSVlad Serebrennikov template<typename T> void f<T*>() {} 571d358b2deSVlad Serebrennikov // expected-error@-1 {{function template partial specialization is not allowed}} 572d358b2deSVlad Serebrennikov template<> void f<int>() {} 573463e61a0SVlad Serebrennikov } // namespace cwg229 574d358b2deSVlad Serebrennikov 575d358b2deSVlad Serebrennikov namespace cwg230 { // cwg230: 3.0 576d358b2deSVlad Serebrennikov struct S { 577d358b2deSVlad Serebrennikov S() { f(); } 578d358b2deSVlad Serebrennikov // expected-warning@-1 {{call to pure virtual member function 'f' has undefined behavior; overrides of 'f' in subclasses are not available in the constructor of 'cwg230::S'}} 579d358b2deSVlad Serebrennikov // expected-note@#cwg230-f {{'f' declared here}} 580d358b2deSVlad Serebrennikov virtual void f() = 0; // #cwg230-f 581d358b2deSVlad Serebrennikov }; 582463e61a0SVlad Serebrennikov } // namespace cwg230 583d358b2deSVlad Serebrennikov 58414ba3f9dSVlad Serebrennikov namespace cwg231 { // cwg231: 2.7 585d358b2deSVlad Serebrennikov namespace outer { 586d358b2deSVlad Serebrennikov namespace inner { 587d358b2deSVlad Serebrennikov int i; // #cwg231-i 588d358b2deSVlad Serebrennikov } 589d358b2deSVlad Serebrennikov void f() { using namespace inner; } 590d358b2deSVlad Serebrennikov int j = i; 591d358b2deSVlad Serebrennikov // expected-error@-1 {{use of undeclared identifier 'i'; did you mean 'inner::i'?}} 592d358b2deSVlad Serebrennikov // expected-note@#cwg231-i {{'inner::i' declared here}} 593d358b2deSVlad Serebrennikov } 594463e61a0SVlad Serebrennikov } // namespace cwg231 595d358b2deSVlad Serebrennikov 596d358b2deSVlad Serebrennikov // cwg234: na 597d358b2deSVlad Serebrennikov // cwg235: na 598d358b2deSVlad Serebrennikov 599d358b2deSVlad Serebrennikov namespace cwg236 { // cwg236: 3.2 600d358b2deSVlad Serebrennikov void *p = int(); 601d358b2deSVlad Serebrennikov // cxx98-warning@-1 {{expression which evaluates to zero treated as a null pointer constant of type 'void *'}} 602d358b2deSVlad Serebrennikov // since-cxx11-error@-2 {{cannot initialize a variable of type 'void *' with an rvalue of type 'int'}} 603463e61a0SVlad Serebrennikov } // namespace cwg236 604d358b2deSVlad Serebrennikov 605d358b2deSVlad Serebrennikov namespace cwg237 { // cwg237: dup 470 606d358b2deSVlad Serebrennikov template<typename T> struct A { void f() { T::error; } }; 607d358b2deSVlad Serebrennikov template<typename T> struct B : A<T> {}; 608d358b2deSVlad Serebrennikov template struct B<int>; // ok 609463e61a0SVlad Serebrennikov } // namespace cwg237 610d358b2deSVlad Serebrennikov 61114ba3f9dSVlad Serebrennikov namespace cwg239 { // cwg239: 2.7 612d358b2deSVlad Serebrennikov namespace NS { 613d358b2deSVlad Serebrennikov class T {}; 614d358b2deSVlad Serebrennikov void f(T); 615d358b2deSVlad Serebrennikov float &g(T, int); 616d358b2deSVlad Serebrennikov } 617d358b2deSVlad Serebrennikov NS::T parm; 618d358b2deSVlad Serebrennikov int &g(NS::T, float); 619d358b2deSVlad Serebrennikov int main() { 620d358b2deSVlad Serebrennikov f(parm); 621d358b2deSVlad Serebrennikov float &r = g(parm, 1); 622d358b2deSVlad Serebrennikov extern int &g(NS::T, float); 623d358b2deSVlad Serebrennikov int &s = g(parm, 1); 624d358b2deSVlad Serebrennikov } 625463e61a0SVlad Serebrennikov } // namespace cwg239 626d358b2deSVlad Serebrennikov 627d358b2deSVlad Serebrennikov // cwg240: dup 616 628d358b2deSVlad Serebrennikov 62914ba3f9dSVlad Serebrennikov namespace cwg241 { // cwg241: 9 630d358b2deSVlad Serebrennikov namespace A { 631d358b2deSVlad Serebrennikov struct B {}; 632d358b2deSVlad Serebrennikov template <int X> void f(); // #cwg241-A-f 633d358b2deSVlad Serebrennikov template <int X> void g(B); 634d358b2deSVlad Serebrennikov } 635d358b2deSVlad Serebrennikov namespace C { 636d358b2deSVlad Serebrennikov template <class T> void f(T t); // #cwg241-C-f 637d358b2deSVlad Serebrennikov template <class T> void g(T t); // #cwg241-C-g 638d358b2deSVlad Serebrennikov } 639d358b2deSVlad Serebrennikov void h(A::B b) { 640d358b2deSVlad Serebrennikov f<3>(b); 641d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'f'}} 642d358b2deSVlad Serebrennikov // expected-note@#cwg241-A-f {{candidate function template not viable: requires 0 arguments, but 1 was provided}} 643d358b2deSVlad Serebrennikov // cxx98-17-error@-3 {{use of function template name with no prior declaration in function call with explicit template arguments is a C++20 extension}} 644d358b2deSVlad Serebrennikov g<3>(b); 645d358b2deSVlad Serebrennikov // cxx98-17-error@-1 {{use of function template name with no prior declaration in function call with explicit template arguments is a C++20 extension}} 646d358b2deSVlad Serebrennikov A::f<3>(b); 647d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'f'}} 648d358b2deSVlad Serebrennikov // expected-note@#cwg241-A-f {{candidate function template not viable: requires 0 arguments, but 1 was provided}} 649d358b2deSVlad Serebrennikov A::g<3>(b); 650d358b2deSVlad Serebrennikov C::f<3>(b); 651d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'f'}} 652d358b2deSVlad Serebrennikov // expected-note@#cwg241-C-f {{candidate template ignored: invalid explicitly-specified argument for template parameter 'T'}} 653d358b2deSVlad Serebrennikov C::g<3>(b); 654d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'g'}} 655d358b2deSVlad Serebrennikov // expected-note@#cwg241-C-g {{candidate template ignored: invalid explicitly-specified argument for template parameter 'T'}} 656d358b2deSVlad Serebrennikov using C::f; 657d358b2deSVlad Serebrennikov using C::g; 658d358b2deSVlad Serebrennikov f<3>(b); 659d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching function for call to 'f'}} 660d358b2deSVlad Serebrennikov // expected-note@#cwg241-C-f {{candidate template ignored: invalid explicitly-specified argument for template parameter 'T'}} 661d358b2deSVlad Serebrennikov // expected-note@#cwg241-A-f {{candidate function template not viable: requires 0 arguments, but 1 was provided}} 662d358b2deSVlad Serebrennikov g<3>(b); 663d358b2deSVlad Serebrennikov } 664463e61a0SVlad Serebrennikov } // namespace cwg241 665d358b2deSVlad Serebrennikov 66614ba3f9dSVlad Serebrennikov namespace cwg243 { // cwg243: 2.8 667d358b2deSVlad Serebrennikov struct B; 668d358b2deSVlad Serebrennikov struct A { 669d358b2deSVlad Serebrennikov A(B); // #cwg243-A 670d358b2deSVlad Serebrennikov }; 671d358b2deSVlad Serebrennikov struct B { 672d358b2deSVlad Serebrennikov operator A() = delete; // #cwg243-B 673d358b2deSVlad Serebrennikov // cxx98-error@-1 {{deleted function definitions are a C++11 extension}} 674d358b2deSVlad Serebrennikov } b; 675d358b2deSVlad Serebrennikov A a1(b); 676d358b2deSVlad Serebrennikov A a2 = b; 677d358b2deSVlad Serebrennikov // expected-error@-1 {{conversion from 'struct B' to 'A' is ambiguous}} 678d358b2deSVlad Serebrennikov // expected-note@#cwg243-A {{candidate constructor}} 679d358b2deSVlad Serebrennikov // expected-note@#cwg243-B {{candidate function has been explicitly deleted}} 680463e61a0SVlad Serebrennikov } // namespace cwg243 681d358b2deSVlad Serebrennikov 682d358b2deSVlad Serebrennikov namespace cwg244 { // cwg244: 11 683d358b2deSVlad Serebrennikov // NB: this test is reused by cwg399 684d358b2deSVlad Serebrennikov struct B {}; // #cwg244-B 685d358b2deSVlad Serebrennikov struct D : B {}; 686d358b2deSVlad Serebrennikov 687d358b2deSVlad Serebrennikov D D_object; 688d358b2deSVlad Serebrennikov typedef B B_alias; 689d358b2deSVlad Serebrennikov B* B_ptr = &D_object; 690d358b2deSVlad Serebrennikov 691d358b2deSVlad Serebrennikov void f() { 692d358b2deSVlad Serebrennikov D_object.~B(); 693d358b2deSVlad Serebrennikov // expected-error@-1 {{destructor type 'cwg244::B' in object destruction expression does not match the type 'D' of the object being destroyed}} 694d358b2deSVlad Serebrennikov // expected-note@#cwg244-B {{type 'cwg244::B' found by destructor name lookup}} 695d358b2deSVlad Serebrennikov D_object.B::~B(); 696d358b2deSVlad Serebrennikov D_object.D::~B(); // FIXME: Missing diagnostic for this. 697d358b2deSVlad Serebrennikov B_ptr->~B(); 698d358b2deSVlad Serebrennikov B_ptr->~B_alias(); 699d358b2deSVlad Serebrennikov B_ptr->B_alias::~B(); 700d358b2deSVlad Serebrennikov B_ptr->B_alias::~B_alias(); 701d358b2deSVlad Serebrennikov B_ptr->cwg244::~B(); 702d358b2deSVlad Serebrennikov // expected-error@-1 {{no member named '~B' in namespace 'cwg244'}} 703d358b2deSVlad Serebrennikov B_ptr->cwg244::~B_alias(); 704d358b2deSVlad Serebrennikov // expected-error@-1 {{no member named '~B' in namespace 'cwg244'}} 705d358b2deSVlad Serebrennikov } 706d358b2deSVlad Serebrennikov 707d358b2deSVlad Serebrennikov template<typename T, typename U> 708d358b2deSVlad Serebrennikov void f(T *B_ptr, U D_object) { 709d358b2deSVlad Serebrennikov D_object.~B(); // FIXME: Missing diagnostic for this. 710d358b2deSVlad Serebrennikov D_object.B::~B(); 711d358b2deSVlad Serebrennikov D_object.D::~B(); // FIXME: Missing diagnostic for this. 712d358b2deSVlad Serebrennikov B_ptr->~B(); 713d358b2deSVlad Serebrennikov B_ptr->~B_alias(); 714d358b2deSVlad Serebrennikov B_ptr->B_alias::~B(); 715d358b2deSVlad Serebrennikov B_ptr->B_alias::~B_alias(); 716d358b2deSVlad Serebrennikov B_ptr->cwg244::~B(); 717d358b2deSVlad Serebrennikov // expected-error@-1 {{'cwg244' does not refer to a type name in pseudo-destructor expression; expected the name of type 'T'}} 718d358b2deSVlad Serebrennikov B_ptr->cwg244::~B_alias(); 719d358b2deSVlad Serebrennikov // expected-error@-1 {{'cwg244' does not refer to a type name in pseudo-destructor expression; expected the name of type 'T'}} 720d358b2deSVlad Serebrennikov } 721d358b2deSVlad Serebrennikov template void f<B, D>(B*, D); 722d358b2deSVlad Serebrennikov 723d358b2deSVlad Serebrennikov namespace N { 724d358b2deSVlad Serebrennikov template<typename T> struct E {}; 725d358b2deSVlad Serebrennikov typedef E<int> F; 726d358b2deSVlad Serebrennikov } 727d358b2deSVlad Serebrennikov void g(N::F f) { 728d358b2deSVlad Serebrennikov typedef N::F G; // #cwg244-G 729d358b2deSVlad Serebrennikov f.~G(); 730d358b2deSVlad Serebrennikov f.G::~E(); 731d358b2deSVlad Serebrennikov // expected-error@-1 {{ISO C++ requires the name after '::~' to be found in the same scope as the name before '::~'}} 732d358b2deSVlad Serebrennikov f.G::~F(); 733d358b2deSVlad Serebrennikov // expected-error@-1 {{undeclared identifier 'F' in destructor name}} 734d358b2deSVlad Serebrennikov f.G::~G(); 735d358b2deSVlad Serebrennikov // This is technically ill-formed; E is looked up in 'N::' and names the 736d358b2deSVlad Serebrennikov // class template, not the injected-class-name of the class. But that's 737d358b2deSVlad Serebrennikov // probably a bug in the standard. 738d358b2deSVlad Serebrennikov f.N::F::~E(); 739d358b2deSVlad Serebrennikov // expected-error@-1 {{ISO C++ requires the name after '::~' to be found in the same scope as the name before '::~'}} 740d358b2deSVlad Serebrennikov // This is valid; we look up the second F in the same scope in which we 741d358b2deSVlad Serebrennikov // found the first one, that is, 'N::'. 742d358b2deSVlad Serebrennikov f.N::F::~F(); 743d358b2deSVlad Serebrennikov // This is technically ill-formed; G is looked up in 'N::' and is not found. 744d358b2deSVlad Serebrennikov // Rejecting this seems correct, but most compilers accept, so we do also. 745d358b2deSVlad Serebrennikov f.N::F::~G(); 746d358b2deSVlad Serebrennikov // expected-error@-1 {{qualified destructor name only found in lexical scope; omit the qualifier to find this type name by unqualified lookup}} 747d358b2deSVlad Serebrennikov // expected-note@#cwg244-G {{type 'G' (aka 'E<int>') found by destructor name lookup}} 748d358b2deSVlad Serebrennikov } 749d358b2deSVlad Serebrennikov 750d358b2deSVlad Serebrennikov // Bizarrely, compilers perform lookup in the scope for qualified destructor 751d358b2deSVlad Serebrennikov // names, if the nested-name-specifier is non-dependent. Ensure we diagnose 752d358b2deSVlad Serebrennikov // this. 753d358b2deSVlad Serebrennikov namespace QualifiedLookupInScope { 754d358b2deSVlad Serebrennikov namespace N { 755d358b2deSVlad Serebrennikov template <typename> struct S { struct Inner {}; }; 756d358b2deSVlad Serebrennikov } 757d358b2deSVlad Serebrennikov template <typename U> void f(typename N::S<U>::Inner *p) { 758d358b2deSVlad Serebrennikov typedef typename N::S<U>::Inner T; 759d358b2deSVlad Serebrennikov p->::cwg244::QualifiedLookupInScope::N::S<U>::Inner::~T(); 760d358b2deSVlad Serebrennikov // expected-error@-1 {{no type named 'T' in 'cwg244::QualifiedLookupInScope::N::S<int>'}} 761d358b2deSVlad Serebrennikov // expected-note@#cwg244-f {{in instantiation of function template specialization 'cwg244::QualifiedLookupInScope::f<int>' requested here}} 762d358b2deSVlad Serebrennikov } 763d358b2deSVlad Serebrennikov template void f<int>(N::S<int>::Inner *); // #cwg244-f 764d358b2deSVlad Serebrennikov 765d358b2deSVlad Serebrennikov template <typename U> void g(U *p) { 766d358b2deSVlad Serebrennikov typedef U T; 767d358b2deSVlad Serebrennikov p->T::~T(); 768d358b2deSVlad Serebrennikov p->U::~T(); 769d358b2deSVlad Serebrennikov p->::cwg244::QualifiedLookupInScope::N::S<int>::Inner::~T(); 770d358b2deSVlad Serebrennikov // expected-error@-1 {{'T' does not refer to a type name in pseudo-destructor expression; expected the name of type 'U'}} 771d358b2deSVlad Serebrennikov } 772d358b2deSVlad Serebrennikov template void g(N::S<int>::Inner *); 773d358b2deSVlad Serebrennikov } 774463e61a0SVlad Serebrennikov } // namespace cwg244 775d358b2deSVlad Serebrennikov 77614ba3f9dSVlad Serebrennikov namespace cwg245 { // cwg245: 2.8 777d358b2deSVlad Serebrennikov struct S { 778d358b2deSVlad Serebrennikov enum E {}; // #cwg245-E 779d358b2deSVlad Serebrennikov class E *p; 780d358b2deSVlad Serebrennikov // expected-error@-1 {{use of 'E' with tag type that does not match previous declaration}} 781d358b2deSVlad Serebrennikov // expected-note@#cwg245-E {{previous use is here}} 782d358b2deSVlad Serebrennikov }; 783463e61a0SVlad Serebrennikov } // namespace cwg245 784d358b2deSVlad Serebrennikov 785d358b2deSVlad Serebrennikov namespace cwg246 { // cwg246: 3.2 786d358b2deSVlad Serebrennikov struct S { 787d358b2deSVlad Serebrennikov S() try { // #cwg246-try 788d358b2deSVlad Serebrennikov throw 0; 789d358b2deSVlad Serebrennikov X: ; 790d358b2deSVlad Serebrennikov } catch (int) { 791d358b2deSVlad Serebrennikov goto X; 792d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot jump from this goto statement to its label}} 793d358b2deSVlad Serebrennikov // expected-note@#cwg246-try {{jump bypasses initialization of try block}} 794d358b2deSVlad Serebrennikov } 795d358b2deSVlad Serebrennikov }; 796463e61a0SVlad Serebrennikov } // namespace cwg246 797d358b2deSVlad Serebrennikov 79814ba3f9dSVlad Serebrennikov namespace cwg247 { // cwg247: 2.7 799d358b2deSVlad Serebrennikov struct A {}; 800d358b2deSVlad Serebrennikov struct B : A { 801d358b2deSVlad Serebrennikov void f(); 802d358b2deSVlad Serebrennikov void f(int); 803d358b2deSVlad Serebrennikov }; 804d358b2deSVlad Serebrennikov void (A::*f)() = (void (A::*)())&B::f; 805d358b2deSVlad Serebrennikov 806d358b2deSVlad Serebrennikov struct C { 807d358b2deSVlad Serebrennikov void f(); 808d358b2deSVlad Serebrennikov void f(int); 809d358b2deSVlad Serebrennikov }; 810d358b2deSVlad Serebrennikov struct D : C {}; 811d358b2deSVlad Serebrennikov void (C::*g)() = &D::f; 812d358b2deSVlad Serebrennikov void (D::*h)() = &D::f; 813d358b2deSVlad Serebrennikov 814d358b2deSVlad Serebrennikov struct E { 815d358b2deSVlad Serebrennikov void f(); 816d358b2deSVlad Serebrennikov }; 817d358b2deSVlad Serebrennikov struct F : E { 818d358b2deSVlad Serebrennikov using E::f; 819d358b2deSVlad Serebrennikov void f(int); 820d358b2deSVlad Serebrennikov }; 821d358b2deSVlad Serebrennikov void (F::*i)() = &F::f; 822463e61a0SVlad Serebrennikov } // namespace cwg247 823d358b2deSVlad Serebrennikov 824d358b2deSVlad Serebrennikov namespace cwg248 { // cwg248: sup P1949 825d358b2deSVlad Serebrennikov int \u040d\u040e = 0; 826463e61a0SVlad Serebrennikov } // namespace cwg248 827d358b2deSVlad Serebrennikov 82814ba3f9dSVlad Serebrennikov namespace cwg249 { // cwg249: 2.7 829d358b2deSVlad Serebrennikov template<typename T> struct X { void f(); }; 830d358b2deSVlad Serebrennikov template<typename T> void X<T>::f() {} 831463e61a0SVlad Serebrennikov } // namespace cwg249 832d358b2deSVlad Serebrennikov 83314ba3f9dSVlad Serebrennikov namespace cwg250 { // cwg250: 2.7 834d358b2deSVlad Serebrennikov typedef void (*FPtr)(double x[]); 835d358b2deSVlad Serebrennikov 836d358b2deSVlad Serebrennikov template<int I> void f(double x[]); 837d358b2deSVlad Serebrennikov FPtr fp = &f<3>; 838d358b2deSVlad Serebrennikov 839d358b2deSVlad Serebrennikov template<int I = 3> void g(double x[]); 840d358b2deSVlad Serebrennikov // cxx98-error@-1 {{default template arguments for a function template are a C++11 extension}} 841d358b2deSVlad Serebrennikov FPtr gp = &g<>; 842463e61a0SVlad Serebrennikov } // namespace cwg250 843d358b2deSVlad Serebrennikov 844d358b2deSVlad Serebrennikov namespace cwg252 { // cwg252: 3.1 845d358b2deSVlad Serebrennikov struct A { 846d358b2deSVlad Serebrennikov void operator delete(void*); // #cwg252-A 847d358b2deSVlad Serebrennikov }; 848d358b2deSVlad Serebrennikov struct B { 849d358b2deSVlad Serebrennikov void operator delete(void*); // #cwg252-B 850d358b2deSVlad Serebrennikov }; 851d358b2deSVlad Serebrennikov struct C : A, B { 852d358b2deSVlad Serebrennikov virtual ~C(); 853d358b2deSVlad Serebrennikov }; 854d358b2deSVlad Serebrennikov C::~C() {} 855d358b2deSVlad Serebrennikov // expected-error@-1 {{member 'operator delete' found in multiple base classes of different types}} 856d358b2deSVlad Serebrennikov // expected-note@#cwg252-A {{member found by ambiguous name lookup}} 857d358b2deSVlad Serebrennikov // expected-note@#cwg252-B {{member found by ambiguous name lookup}} 858d358b2deSVlad Serebrennikov 859d358b2deSVlad Serebrennikov struct D { 860d358b2deSVlad Serebrennikov void operator delete(void*, int); // #cwg252-D 861d358b2deSVlad Serebrennikov virtual ~D(); 862d358b2deSVlad Serebrennikov }; 863d358b2deSVlad Serebrennikov D::~D() {} 864d358b2deSVlad Serebrennikov // expected-error@-1 {{no suitable member 'operator delete' in 'D'}} 865d358b2deSVlad Serebrennikov // expected-note@#cwg252-D {{member 'operator delete' declared here}} 866d358b2deSVlad Serebrennikov 867d358b2deSVlad Serebrennikov struct E { 868d358b2deSVlad Serebrennikov void operator delete(void*, int); 869d358b2deSVlad Serebrennikov void operator delete(void*) = delete; // #cwg252-E 870d358b2deSVlad Serebrennikov // cxx98-error@-1 {{deleted function definitions are a C++11 extension}} 871d358b2deSVlad Serebrennikov virtual ~E(); 872d358b2deSVlad Serebrennikov }; 873d358b2deSVlad Serebrennikov E::~E() {} 874d358b2deSVlad Serebrennikov // expected-error@-1 {{attempt to use a deleted function}} 875d358b2deSVlad Serebrennikov // expected-note@#cwg252-E {{'operator delete' has been explicitly marked deleted here}} 876d358b2deSVlad Serebrennikov 877d358b2deSVlad Serebrennikov struct F { 878d358b2deSVlad Serebrennikov // If both functions are available, the first one is a placement delete. 879d358b2deSVlad Serebrennikov void operator delete(void*, size_t); 880d358b2deSVlad Serebrennikov void operator delete(void*) = delete; // #cwg252-F 881d358b2deSVlad Serebrennikov // cxx98-error@-1 {{deleted function definitions are a C++11 extension}} 882d358b2deSVlad Serebrennikov virtual ~F(); 883d358b2deSVlad Serebrennikov }; 884d358b2deSVlad Serebrennikov F::~F() {} 885d358b2deSVlad Serebrennikov // expected-error@-1 {{attempt to use a deleted function}} 886d358b2deSVlad Serebrennikov // expected-note@#cwg252-F {{'operator delete' has been explicitly marked deleted here}} 887d358b2deSVlad Serebrennikov 888d358b2deSVlad Serebrennikov struct G { 889d358b2deSVlad Serebrennikov void operator delete(void*, size_t); 890d358b2deSVlad Serebrennikov virtual ~G(); 891d358b2deSVlad Serebrennikov }; 892d358b2deSVlad Serebrennikov G::~G() {} 893463e61a0SVlad Serebrennikov } // namespace cwg252 894d358b2deSVlad Serebrennikov 895d358b2deSVlad Serebrennikov namespace cwg254 { // cwg254: 2.9 896d358b2deSVlad Serebrennikov template<typename T> struct A { 897d358b2deSVlad Serebrennikov typedef typename T::type type; // ok even if this is a typedef-name, because 898d358b2deSVlad Serebrennikov // it's not an elaborated-type-specifier 899d358b2deSVlad Serebrennikov typedef struct T::type foo; 900bbddedb3Skper // expected-error@-1 {{typedef 'type' cannot be referenced with the 'struct' specifier}} 901d358b2deSVlad Serebrennikov // expected-note@#cwg254-instantiation {{in instantiation of template class 'cwg254::A<cwg254::C>' requested here}} 902d358b2deSVlad Serebrennikov // expected-note@#cwg254-C {{declared here}} 903d358b2deSVlad Serebrennikov }; 904d358b2deSVlad Serebrennikov struct B { struct type {}; }; 905d358b2deSVlad Serebrennikov struct C { typedef struct {} type; }; // #cwg254-C 906d358b2deSVlad Serebrennikov A<B>::type n; 907d358b2deSVlad Serebrennikov A<C>::type n; // #cwg254-instantiation 908463e61a0SVlad Serebrennikov } // namespace cwg254 909d358b2deSVlad Serebrennikov 91014ba3f9dSVlad Serebrennikov namespace cwg255 { // cwg255: 2.7 911d358b2deSVlad Serebrennikov struct S { 91214ba3f9dSVlad Serebrennikov void operator delete(void *){} 91314ba3f9dSVlad Serebrennikov void operator delete(void *, int){} 914d358b2deSVlad Serebrennikov }; 915d358b2deSVlad Serebrennikov void f(S *p) { delete p; } 916d358b2deSVlad Serebrennikov } // namespace cwg255 917d358b2deSVlad Serebrennikov 918d358b2deSVlad Serebrennikov // cwg256: dup 624 919d358b2deSVlad Serebrennikov 920d358b2deSVlad Serebrennikov namespace cwg257 { // cwg257: 3.4 921d358b2deSVlad Serebrennikov struct A { A(int); }; // #cwg257-A 922d358b2deSVlad Serebrennikov struct B : virtual A { 923d358b2deSVlad Serebrennikov B() {} 924d358b2deSVlad Serebrennikov virtual void f() = 0; 925d358b2deSVlad Serebrennikov }; 926d358b2deSVlad Serebrennikov struct C : B { 927d358b2deSVlad Serebrennikov C() {} 928d358b2deSVlad Serebrennikov }; 929d358b2deSVlad Serebrennikov struct D : B { 930d358b2deSVlad Serebrennikov D() {} 931d358b2deSVlad Serebrennikov // expected-error@-1 {{constructor for 'cwg257::D' must explicitly initialize the base class 'A' which does not have a default constructor}} 932d358b2deSVlad Serebrennikov // expected-note@#cwg257-A {{'cwg257::A' declared here}} 933d358b2deSVlad Serebrennikov void f(); 934d358b2deSVlad Serebrennikov }; 935463e61a0SVlad Serebrennikov } // namespace cwg257 936d358b2deSVlad Serebrennikov 937d358b2deSVlad Serebrennikov namespace cwg258 { // cwg258: 2.8 938d358b2deSVlad Serebrennikov struct A { 939d358b2deSVlad Serebrennikov void f(const int); 940d358b2deSVlad Serebrennikov template<typename> void g(int); 941d358b2deSVlad Serebrennikov float &h() const; 942d358b2deSVlad Serebrennikov }; 943d358b2deSVlad Serebrennikov struct B : A { 944d358b2deSVlad Serebrennikov using A::f; 945d358b2deSVlad Serebrennikov using A::g; 946d358b2deSVlad Serebrennikov using A::h; 947d358b2deSVlad Serebrennikov int &f(int); 948d358b2deSVlad Serebrennikov template<int> int &g(int); // #cwg258-B-g 949d358b2deSVlad Serebrennikov int &h(); 950d358b2deSVlad Serebrennikov } b; 951d358b2deSVlad Serebrennikov int &w = b.f(0); 952d358b2deSVlad Serebrennikov int &x = b.g<int>(0); 953d358b2deSVlad Serebrennikov // expected-error@-1 {{no matching member function for call to 'g'}} 954d358b2deSVlad Serebrennikov // expected-note@#cwg258-B-g {{candidate template ignored: invalid explicitly-specified argument for 1st template parameter}} 955d358b2deSVlad Serebrennikov int &y = b.h(); 956d358b2deSVlad Serebrennikov float &z = const_cast<const B&>(b).h(); 957d358b2deSVlad Serebrennikov 958d358b2deSVlad Serebrennikov struct C { 959d358b2deSVlad Serebrennikov virtual void f(const int) = 0; 960d358b2deSVlad Serebrennikov }; 961d358b2deSVlad Serebrennikov struct D : C { 962d358b2deSVlad Serebrennikov void f(int); 963d358b2deSVlad Serebrennikov } d; 964d358b2deSVlad Serebrennikov 965d358b2deSVlad Serebrennikov struct E { 966d358b2deSVlad Serebrennikov virtual void f() = 0; // #cwg258-E-f 967d358b2deSVlad Serebrennikov }; 968d358b2deSVlad Serebrennikov struct F : E { 969d358b2deSVlad Serebrennikov void f() const {} 970d358b2deSVlad Serebrennikov } f; 971d358b2deSVlad Serebrennikov // expected-error@-1 {{variable type 'struct F' is an abstract class}} 972d358b2deSVlad Serebrennikov // expected-note@#cwg258-E-f {{unimplemented pure virtual method 'f' in 'F'}} 973463e61a0SVlad Serebrennikov } // namespace cwg258 974d358b2deSVlad Serebrennikov 975d358b2deSVlad Serebrennikov namespace cwg259 { // cwg259: 4 976d358b2deSVlad Serebrennikov template<typename T> struct A {}; 977d358b2deSVlad Serebrennikov template struct A<int>; // #cwg259-A-int 978d358b2deSVlad Serebrennikov template struct A<int>; 979d358b2deSVlad Serebrennikov // expected-error@-1 {{duplicate explicit instantiation of 'A<int>'}} 980d358b2deSVlad Serebrennikov // expected-note@#cwg259-A-int {{previous explicit instantiation is here}} 981d358b2deSVlad Serebrennikov 982d358b2deSVlad Serebrennikov template<> struct A<float>; // #cwg259-A-float 983d358b2deSVlad Serebrennikov template struct A<float>; 984d358b2deSVlad Serebrennikov // expected-warning@-1 {{explicit instantiation of 'A<float>' that occurs after an explicit specialization has no effect}} 985d358b2deSVlad Serebrennikov // expected-note@#cwg259-A-float {{previous template specialization is here}} 986d358b2deSVlad Serebrennikov 987d358b2deSVlad Serebrennikov template struct A<char>; // #cwg259-A-char 988d358b2deSVlad Serebrennikov template<> struct A<char>; 989d358b2deSVlad Serebrennikov // expected-error@-1 {{explicit specialization of 'cwg259::A<char>' after instantiation}} 990d358b2deSVlad Serebrennikov // expected-note@#cwg259-A-char {{explicit instantiation first required here}} 991d358b2deSVlad Serebrennikov 992d358b2deSVlad Serebrennikov template<> struct A<double>; 993d358b2deSVlad Serebrennikov template<> struct A<double>; 994d358b2deSVlad Serebrennikov template<> struct A<double> {}; // #cwg259-A-double 995d358b2deSVlad Serebrennikov template<> struct A<double> {}; 996d358b2deSVlad Serebrennikov // expected-error@-1 {{redefinition of 'A<double>'}} 997d358b2deSVlad Serebrennikov // expected-note@#cwg259-A-double {{previous definition is here}} 998d358b2deSVlad Serebrennikov 999d358b2deSVlad Serebrennikov template<typename T> struct B; // #cwg259-B 1000d358b2deSVlad Serebrennikov template struct B<int>; 1001d358b2deSVlad Serebrennikov // expected-error@-1 {{explicit instantiation of undefined template 'cwg259::B<int>'}} 1002d358b2deSVlad Serebrennikov // expected-note@#cwg259-B {{template is declared here}} 1003d358b2deSVlad Serebrennikov 1004d358b2deSVlad Serebrennikov template<> struct B<float>; // #cwg259-B-float 1005d358b2deSVlad Serebrennikov template struct B<float>; 1006d358b2deSVlad Serebrennikov // expected-warning@-1 {{explicit instantiation of 'B<float>' that occurs after an explicit specialization has no effect}} 1007d358b2deSVlad Serebrennikov // expected-note@#cwg259-B-float {{previous template specialization is here}} 1008463e61a0SVlad Serebrennikov } // namespace cwg259 1009d358b2deSVlad Serebrennikov 1010d358b2deSVlad Serebrennikov // FIXME: When cwg260 is resolved, also add tests for CWG507. 1011d358b2deSVlad Serebrennikov 1012d358b2deSVlad Serebrennikov namespace cwg261 { // cwg261: no 1013d358b2deSVlad Serebrennikov #pragma clang diagnostic push 1014d358b2deSVlad Serebrennikov #pragma clang diagnostic warning "-Wused-but-marked-unused" 1015d358b2deSVlad Serebrennikov 1016d358b2deSVlad Serebrennikov // FIXME: This is ill-formed, with a diagnostic required, because operator new 1017d358b2deSVlad Serebrennikov // and operator delete are inline and odr-used, but not defined in this 1018d358b2deSVlad Serebrennikov // translation unit. 1019d358b2deSVlad Serebrennikov // We're also missing the -Wused-but-marked-unused diagnostic here. 1020d358b2deSVlad Serebrennikov struct A { 1021d358b2deSVlad Serebrennikov inline void *operator new(size_t) __attribute__((unused)); 1022d358b2deSVlad Serebrennikov inline void operator delete(void*) __attribute__((unused)); 1023d358b2deSVlad Serebrennikov A() {} 1024d358b2deSVlad Serebrennikov }; 1025d358b2deSVlad Serebrennikov 1026d358b2deSVlad Serebrennikov // FIXME: This is ill-formed, with a required diagnostic, for the same 1027d358b2deSVlad Serebrennikov // reason. 1028d358b2deSVlad Serebrennikov struct B { 1029d358b2deSVlad Serebrennikov inline void operator delete(void*) __attribute__((unused)); 1030d358b2deSVlad Serebrennikov ~B() {} 1031d358b2deSVlad Serebrennikov }; 1032d358b2deSVlad Serebrennikov struct C { 1033d358b2deSVlad Serebrennikov inline void operator delete(void*) __attribute__((unused)); 1034d358b2deSVlad Serebrennikov virtual ~C() {} 1035d358b2deSVlad Serebrennikov // expected-warning@-1 {{'operator delete' was marked unused but was used}} 1036d358b2deSVlad Serebrennikov }; 1037d358b2deSVlad Serebrennikov 1038d358b2deSVlad Serebrennikov struct D { 1039d358b2deSVlad Serebrennikov inline void operator delete(void*) __attribute__((unused)); 1040d358b2deSVlad Serebrennikov }; 1041d358b2deSVlad Serebrennikov void h() { C::operator delete(0); } 1042d358b2deSVlad Serebrennikov // expected-warning@-1 {{'operator delete' was marked unused but was used}} 1043d358b2deSVlad Serebrennikov 1044d358b2deSVlad Serebrennikov #pragma clang diagnostic pop 1045463e61a0SVlad Serebrennikov } // namespace cwg261 1046d358b2deSVlad Serebrennikov 104714ba3f9dSVlad Serebrennikov namespace cwg262 { // cwg262: 2.7 1048d358b2deSVlad Serebrennikov int f(int = 0, ...); 1049d358b2deSVlad Serebrennikov int k = f(); 1050d358b2deSVlad Serebrennikov int l = f(0); 1051d358b2deSVlad Serebrennikov int m = f(0, 0); 1052463e61a0SVlad Serebrennikov } // namespace cwg262 1053d358b2deSVlad Serebrennikov 1054d358b2deSVlad Serebrennikov namespace cwg263 { // cwg263: 3.3 1055d358b2deSVlad Serebrennikov struct X {}; 1056d358b2deSVlad Serebrennikov struct Y { 1057d358b2deSVlad Serebrennikov #if __cplusplus < 201103L 1058d358b2deSVlad Serebrennikov friend X::X() throw(); 1059d358b2deSVlad Serebrennikov friend X::~X() throw(); 1060d358b2deSVlad Serebrennikov #elif __cplusplus <= 201703L 1061d358b2deSVlad Serebrennikov friend constexpr X::X() noexcept; 1062d358b2deSVlad Serebrennikov friend X::~X(); 1063d358b2deSVlad Serebrennikov #else 1064d358b2deSVlad Serebrennikov friend constexpr X::X() noexcept; 1065d358b2deSVlad Serebrennikov friend constexpr X::~X(); 1066d358b2deSVlad Serebrennikov #endif 1067d358b2deSVlad Serebrennikov Y::Y(); 1068d358b2deSVlad Serebrennikov // expected-error@-1 {{extra qualification on member 'Y'}} 1069d358b2deSVlad Serebrennikov Y::~Y(); 1070d358b2deSVlad Serebrennikov // expected-error@-1 {{extra qualification on member '~Y'}} 1071d358b2deSVlad Serebrennikov }; 1072463e61a0SVlad Serebrennikov } // namespace cwg263 1073d358b2deSVlad Serebrennikov 1074d358b2deSVlad Serebrennikov // cwg265: dup 353 1075d358b2deSVlad Serebrennikov // cwg266: na 1076d358b2deSVlad Serebrennikov // cwg269: na 1077d358b2deSVlad Serebrennikov // cwg270: na 1078d358b2deSVlad Serebrennikov 107914ba3f9dSVlad Serebrennikov namespace cwg272 { // cwg272: 2.7 1080d358b2deSVlad Serebrennikov struct X { 1081d358b2deSVlad Serebrennikov void f() { 1082d358b2deSVlad Serebrennikov this->~X(); 1083d358b2deSVlad Serebrennikov X::~X(); 1084d358b2deSVlad Serebrennikov ~X(); 1085d358b2deSVlad Serebrennikov // expected-error@-1 {{invalid argument type 'X' to unary expression}} 1086d358b2deSVlad Serebrennikov } 1087d358b2deSVlad Serebrennikov }; 1088463e61a0SVlad Serebrennikov } // namespace cwg272 1089d358b2deSVlad Serebrennikov 1090b79d3b95SVlad Serebrennikov // cwg273 is in cwg273.cpp 1091d358b2deSVlad Serebrennikov // cwg274: na 1092d358b2deSVlad Serebrennikov 1093d358b2deSVlad Serebrennikov namespace cwg275 { // cwg275: no 1094d358b2deSVlad Serebrennikov namespace N { 1095d358b2deSVlad Serebrennikov template <class T> void f(T) {} // #cwg275-N-f 1096d358b2deSVlad Serebrennikov template <class T> void g(T) {} // #cwg275-N-g 1097d358b2deSVlad Serebrennikov template <> void f(int); 1098d358b2deSVlad Serebrennikov template <> void f(char); 1099d358b2deSVlad Serebrennikov template <> void f(double); 1100d358b2deSVlad Serebrennikov template <> void g(char); 1101d358b2deSVlad Serebrennikov } 1102d358b2deSVlad Serebrennikov 1103d358b2deSVlad Serebrennikov using namespace N; 1104d358b2deSVlad Serebrennikov 1105d358b2deSVlad Serebrennikov namespace M { 1106d358b2deSVlad Serebrennikov template <> void N::f(char) {} 1107d358b2deSVlad Serebrennikov // expected-error@-1 {{cannot define or redeclare 'f' here because namespace 'M' does not enclose namespace 'N'}} 1108d358b2deSVlad Serebrennikov template <class T> void g(T) {} 1109d358b2deSVlad Serebrennikov template <> void g(char) {} 1110d358b2deSVlad Serebrennikov // FIXME: this should be rejected in c++98 too 1111d358b2deSVlad Serebrennikov template void f(long); 1112d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{explicit instantiation of 'cwg275::N::f' must occur in namespace 'N'}} 1113d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg275-N-f {{explicit instantiation refers here}} 1114d358b2deSVlad Serebrennikov // FIXME: this should be rejected in c++98 too 1115d358b2deSVlad Serebrennikov template void N::f(unsigned long); 1116d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{explicit instantiation of 'f' not in a namespace enclosing 'N'}} 1117d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg275-N-f {{explicit instantiation refers here}} 1118d358b2deSVlad Serebrennikov template void h(long); 1119d358b2deSVlad Serebrennikov // expected-error@-1 {{explicit instantiation of 'h' does not refer to a function template, variable template, member function, member class, or static data member}} 1120d358b2deSVlad Serebrennikov template <> void f(double) {} 1121d358b2deSVlad Serebrennikov // expected-error@-1 {{no function template matches function template specialization 'f'}} 1122d358b2deSVlad Serebrennikov } 1123d358b2deSVlad Serebrennikov 1124d358b2deSVlad Serebrennikov template <class T> void g(T) {} // #cwg275-g 1125d358b2deSVlad Serebrennikov 1126d358b2deSVlad Serebrennikov template <> void N::f(char) {} 1127d358b2deSVlad Serebrennikov template <> void f(int) {} 1128d358b2deSVlad Serebrennikov // expected-error@-1 {{no function template matches function template specialization 'f'}} 1129d358b2deSVlad Serebrennikov 1130d358b2deSVlad Serebrennikov // FIXME: this should be rejected in c++98 too 1131d358b2deSVlad Serebrennikov template void f(short); 1132d358b2deSVlad Serebrennikov // since-cxx11-error@-1 {{explicit instantiation of 'cwg275::N::f' must occur in namespace 'N'}} 1133d358b2deSVlad Serebrennikov // since-cxx11-note@#cwg275-N-f {{explicit instantiation refers here}} 1134d358b2deSVlad Serebrennikov template void N::f(unsigned short); 1135d358b2deSVlad Serebrennikov 1136d358b2deSVlad Serebrennikov // FIXME: this should probably be valid. the wording from the issue 1137d358b2deSVlad Serebrennikov // doesn't clarify this, but it follows from the usual rules. 1138d358b2deSVlad Serebrennikov template void g(int); 1139d358b2deSVlad Serebrennikov // expected-error@-1 {{partial ordering for explicit instantiation of 'g' is ambiguous}} 1140d358b2deSVlad Serebrennikov // expected-note@#cwg275-g {{explicit instantiation candidate function 'cwg275::g<int>' template here [with T = int]}} 1141d358b2deSVlad Serebrennikov // expected-note@#cwg275-N-g {{explicit instantiation candidate function 'cwg275::N::g<int>' template here [with T = int]}} 1142d358b2deSVlad Serebrennikov 1143d358b2deSVlad Serebrennikov // FIXME: likewise, this should also be valid. 1144d358b2deSVlad Serebrennikov template<typename T> void f(T) {} // #cwg275-f 1145d358b2deSVlad Serebrennikov template void f(short); 1146d358b2deSVlad Serebrennikov // expected-error@-1 {{partial ordering for explicit instantiation of 'f' is ambiguous}} 1147d358b2deSVlad Serebrennikov // expected-note@#cwg275-f {{explicit instantiation candidate function 'cwg275::f<short>' template here [with T = short]}} 1148d358b2deSVlad Serebrennikov // expected-note@#cwg275-N-f {{explicit instantiation candidate function 'cwg275::N::f<short>' template here [with T = short]}} 1149463e61a0SVlad Serebrennikov } // namespace cwg275 1150d358b2deSVlad Serebrennikov 1151d358b2deSVlad Serebrennikov // cwg276: na 1152d358b2deSVlad Serebrennikov 1153d358b2deSVlad Serebrennikov namespace cwg277 { // cwg277: 3.1 1154d358b2deSVlad Serebrennikov typedef int *intp; 1155d358b2deSVlad Serebrennikov int *p = intp(); 1156d358b2deSVlad Serebrennikov static_assert(__enable_constant_folding(!intp()), ""); 1157463e61a0SVlad Serebrennikov } // namespace cwg277 1158d358b2deSVlad Serebrennikov 1159d83485a0SVlad Serebrennikov // cwg279 is in cwg279.cpp 1160d83485a0SVlad Serebrennikov 1161d358b2deSVlad Serebrennikov namespace cwg280 { // cwg280: 2.9 1162d358b2deSVlad Serebrennikov typedef void f0(); 1163d358b2deSVlad Serebrennikov typedef void f1(int); 1164d358b2deSVlad Serebrennikov typedef void f2(int, int); 1165d358b2deSVlad Serebrennikov typedef void f3(int, int, int); 1166d358b2deSVlad Serebrennikov struct A { 1167d358b2deSVlad Serebrennikov operator f1*(); // #cwg280-A-f1 1168d358b2deSVlad Serebrennikov operator f2*(); 1169d358b2deSVlad Serebrennikov }; 1170d358b2deSVlad Serebrennikov struct B { 1171d358b2deSVlad Serebrennikov operator f0*(); // #cwg280-B-f0 1172d358b2deSVlad Serebrennikov private: 1173d358b2deSVlad Serebrennikov operator f3*(); // #cwg280-B-f3 1174d358b2deSVlad Serebrennikov }; 1175d358b2deSVlad Serebrennikov struct C { 1176d358b2deSVlad Serebrennikov operator f0*(); // #cwg280-C-f0 1177d358b2deSVlad Serebrennikov operator f1*(); // #cwg280-C-f1 1178d358b2deSVlad Serebrennikov operator f2*(); // #cwg280-C-f2 1179d358b2deSVlad Serebrennikov operator f3*(); // #cwg280-C-f3 1180d358b2deSVlad Serebrennikov }; 1181d358b2deSVlad Serebrennikov struct D : private A, B { // #cwg280-D 1182d358b2deSVlad Serebrennikov operator f2*(); // #cwg280-D-f2 1183d358b2deSVlad Serebrennikov } d; 1184d358b2deSVlad Serebrennikov struct E : C, D {} e; 1185d358b2deSVlad Serebrennikov void g() { 1186d358b2deSVlad Serebrennikov d(); // ok, public 1187d358b2deSVlad Serebrennikov d(0); 1188d358b2deSVlad Serebrennikov // expected-error@-1 {{'operator void (*)(int)' is a private member of 'cwg280::A'}} 1189d358b2deSVlad Serebrennikov // expected-note@#cwg280-D {{constrained by private inheritance here}} 1190d358b2deSVlad Serebrennikov // expected-note@#cwg280-A-f1 {{member is declared here}} 1191d358b2deSVlad Serebrennikov d(0, 0); // ok, suppressed by member in D 1192d358b2deSVlad Serebrennikov d(0, 0, 0); 1193d358b2deSVlad Serebrennikov // expected-error@-1 {{'operator void (*)(int, int, int)' is a private member of 'cwg280::B'}} 1194d358b2deSVlad Serebrennikov // expected-note@#cwg280-B-f3 {{declared private here}} 1195d358b2deSVlad Serebrennikov e(); 1196d358b2deSVlad Serebrennikov // expected-error@-1 {{call to object of type 'struct E' is ambiguous}} 1197d358b2deSVlad Serebrennikov // expected-note@#cwg280-B-f0 {{conversion candidate of type 'void (*)()'}} 1198d358b2deSVlad Serebrennikov // expected-note@#cwg280-C-f0 {{conversion candidate of type 'void (*)()'}} 1199d358b2deSVlad Serebrennikov e(0); 1200d358b2deSVlad Serebrennikov // expected-error@-1 {{call to object of type 'struct E' is ambiguous}} 1201d358b2deSVlad Serebrennikov // expected-note@#cwg280-A-f1 {{conversion candidate of type 'void (*)(int)'}} 1202d358b2deSVlad Serebrennikov // expected-note@#cwg280-C-f1 {{conversion candidate of type 'void (*)(int)'}} 1203d358b2deSVlad Serebrennikov e(0, 0); 1204d358b2deSVlad Serebrennikov // expected-error@-1 {{call to object of type 'struct E' is ambiguous}} 1205d358b2deSVlad Serebrennikov // expected-note@#cwg280-C-f2 {{conversion candidate of type 'void (*)(int, int)'}} 1206d358b2deSVlad Serebrennikov // expected-note@#cwg280-D-f2 {{conversion candidate of type 'void (*)(int, int)'}} 1207d358b2deSVlad Serebrennikov e(0, 0, 0); 1208d358b2deSVlad Serebrennikov // expected-error@-1 {{call to object of type 'struct E' is ambiguous}} 1209d358b2deSVlad Serebrennikov // expected-note@#cwg280-B-f3 {{conversion candidate of type 'void (*)(int, int, int)'}} 1210d358b2deSVlad Serebrennikov // expected-note@#cwg280-C-f3 {{conversion candidate of type 'void (*)(int, int, int)'}} 1211d358b2deSVlad Serebrennikov } 1212463e61a0SVlad Serebrennikov } // namespace cwg280 1213d358b2deSVlad Serebrennikov 1214d358b2deSVlad Serebrennikov namespace cwg281 { // cwg281: no 1215d358b2deSVlad Serebrennikov void a(); 1216d358b2deSVlad Serebrennikov inline void b(); 1217d358b2deSVlad Serebrennikov 1218d358b2deSVlad Serebrennikov void d(); 1219d358b2deSVlad Serebrennikov inline void e(); 1220d358b2deSVlad Serebrennikov 1221d358b2deSVlad Serebrennikov struct S { 1222d358b2deSVlad Serebrennikov friend inline void a(); // FIXME: ill-formed 1223d358b2deSVlad Serebrennikov friend inline void b(); 1224d358b2deSVlad Serebrennikov friend inline void c(); // FIXME: ill-formed 1225d358b2deSVlad Serebrennikov friend inline void d() {} 1226d358b2deSVlad Serebrennikov friend inline void e() {} 1227d358b2deSVlad Serebrennikov friend inline void f() {} 1228d358b2deSVlad Serebrennikov }; 1229463e61a0SVlad Serebrennikov } // namespace cwg281 1230d358b2deSVlad Serebrennikov 123114ba3f9dSVlad Serebrennikov namespace cwg283 { // cwg283: 2.7 1232d358b2deSVlad Serebrennikov template<typename T> // #cwg283-template 1233d358b2deSVlad Serebrennikov struct S { 1234d358b2deSVlad Serebrennikov friend class T; 1235d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'T' shadows template parameter}} 1236d358b2deSVlad Serebrennikov // expected-note@#cwg283-template {{template parameter is declared here}} 1237d358b2deSVlad Serebrennikov class T; 1238d358b2deSVlad Serebrennikov // expected-error@-1 {{declaration of 'T' shadows template parameter}} 1239d358b2deSVlad Serebrennikov // expected-note@#cwg283-template {{template parameter is declared here}} 1240d358b2deSVlad Serebrennikov }; 1241463e61a0SVlad Serebrennikov } // namespace cwg283 1242d358b2deSVlad Serebrennikov 1243d358b2deSVlad Serebrennikov namespace cwg284 { // cwg284: no 1244d358b2deSVlad Serebrennikov namespace A { 1245d358b2deSVlad Serebrennikov struct X; 1246d358b2deSVlad Serebrennikov enum Y {}; 1247d358b2deSVlad Serebrennikov class Z {}; 1248d358b2deSVlad Serebrennikov } 1249d358b2deSVlad Serebrennikov namespace B { 1250d358b2deSVlad Serebrennikov struct W; 1251d358b2deSVlad Serebrennikov using A::X; 1252d358b2deSVlad Serebrennikov using A::Y; 1253d358b2deSVlad Serebrennikov using A::Z; 1254d358b2deSVlad Serebrennikov } 1255d358b2deSVlad Serebrennikov struct B::V {}; 1256d358b2deSVlad Serebrennikov // expected-error@-1 {{no struct named 'V' in namespace 'cwg284::B'}} 1257d358b2deSVlad Serebrennikov struct B::W {}; 1258d358b2deSVlad Serebrennikov struct B::X {}; // FIXME: ill-formed 1259d358b2deSVlad Serebrennikov enum B::Y e; // ok per cwg417 1260d358b2deSVlad Serebrennikov class B::Z z; // ok per cwg417 1261d358b2deSVlad Serebrennikov 1262d358b2deSVlad Serebrennikov struct C { 1263d358b2deSVlad Serebrennikov struct X; 1264d358b2deSVlad Serebrennikov enum Y {}; 1265d358b2deSVlad Serebrennikov class Z {}; 1266d358b2deSVlad Serebrennikov }; 1267d358b2deSVlad Serebrennikov struct D : C { 1268d358b2deSVlad Serebrennikov struct W; 1269d358b2deSVlad Serebrennikov using C::X; 1270d358b2deSVlad Serebrennikov using C::Y; 1271d358b2deSVlad Serebrennikov using C::Z; 1272d358b2deSVlad Serebrennikov }; 1273d358b2deSVlad Serebrennikov struct D::V {}; 1274d358b2deSVlad Serebrennikov // expected-error@-1 {{no struct named 'V' in 'cwg284::D'}} 1275d358b2deSVlad Serebrennikov struct D::W {}; 1276d358b2deSVlad Serebrennikov struct D::X {}; // FIXME: ill-formed 1277d358b2deSVlad Serebrennikov enum D::Y e2; // ok per cwg417 1278d358b2deSVlad Serebrennikov class D::Z z2; // ok per cwg417 1279463e61a0SVlad Serebrennikov } // namespace cwg284 1280d358b2deSVlad Serebrennikov 128114ba3f9dSVlad Serebrennikov namespace cwg285 { // cwg285: 2.7 1282d358b2deSVlad Serebrennikov template<typename T> void f(T, int); // #cwg285-f-T-int 1283d358b2deSVlad Serebrennikov template<typename T> void f(int, T); // #cwg285-f-int-T 1284d358b2deSVlad Serebrennikov template<> void f<int>(int, int) {} 1285d358b2deSVlad Serebrennikov // expected-error@-1 {{function template specialization 'f' ambiguously refers to more than one function template; explicitly specify additional template arguments to identify a particular function template}} 1286d358b2deSVlad Serebrennikov // expected-note@#cwg285-f-int-T {{function template 'cwg285::f<int>' matches specialization [with T = int]}} 1287d358b2deSVlad Serebrennikov // expected-note@#cwg285-f-T-int {{function template 'cwg285::f<int>' matches specialization [with T = int]}} 1288463e61a0SVlad Serebrennikov } // namespace cwg285 1289d358b2deSVlad Serebrennikov 1290d358b2deSVlad Serebrennikov namespace cwg286 { // cwg286: 2.8 1291d358b2deSVlad Serebrennikov template<class T> struct A { 1292d358b2deSVlad Serebrennikov class C { 1293d358b2deSVlad Serebrennikov template<class T2> struct B {}; // #cwg286-B 1294d358b2deSVlad Serebrennikov }; 1295d358b2deSVlad Serebrennikov }; 1296d358b2deSVlad Serebrennikov 1297d358b2deSVlad Serebrennikov template<class T> 1298d358b2deSVlad Serebrennikov template<class T2> 1299d358b2deSVlad Serebrennikov struct A<T>::C::B<T2*> { }; 1300d358b2deSVlad Serebrennikov 1301d358b2deSVlad Serebrennikov A<short>::C::B<int*> absip; 1302d358b2deSVlad Serebrennikov // expected-error@-1 {{'B' is a private member of 'cwg286::A<short>::C'}} 1303d358b2deSVlad Serebrennikov // expected-note@#cwg286-B {{implicitly declared private here}} 1304463e61a0SVlad Serebrennikov } // namespace cwg286 1305d358b2deSVlad Serebrennikov 1306d358b2deSVlad Serebrennikov // cwg288: na 1307d358b2deSVlad Serebrennikov 130814ba3f9dSVlad Serebrennikov namespace cwg289 { // cwg289: 2.7 1309d358b2deSVlad Serebrennikov struct A; // #cwg289-A 1310d358b2deSVlad Serebrennikov struct B : A {}; 1311d358b2deSVlad Serebrennikov // expected-error@-1 {{base class has incomplete type}} 1312d358b2deSVlad Serebrennikov // expected-note@#cwg289-A {{forward declaration of 'cwg289::A'}} 1313d358b2deSVlad Serebrennikov 1314d358b2deSVlad Serebrennikov template<typename T> struct C { typename T::error error; }; 1315d358b2deSVlad Serebrennikov // expected-error@-1 {{type 'int' cannot be used prior to '::' because it has no members}} 1316d358b2deSVlad Serebrennikov // expected-note@#cwg289-C-int {{in instantiation of template class 'cwg289::C<int>' requested here}} 1317d358b2deSVlad Serebrennikov struct D : C<int> {}; // #cwg289-C-int 1318463e61a0SVlad Serebrennikov } // namespace cwg289 1319d358b2deSVlad Serebrennikov 1320d358b2deSVlad Serebrennikov // cwg290: na 1321d358b2deSVlad Serebrennikov // cwg291: dup 391 1322d358b2deSVlad Serebrennikov // cwg292 is in cwg292.cpp 1323d358b2deSVlad Serebrennikov 1324d358b2deSVlad Serebrennikov namespace cwg294 { // cwg294: no 1325d358b2deSVlad Serebrennikov void f() throw(int); 1326d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 1327d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 1328d358b2deSVlad Serebrennikov int main() { 1329d358b2deSVlad Serebrennikov (void)static_cast<void (*)() throw()>(f); // FIXME: ill-formed in C++14 and before 1330d358b2deSVlad Serebrennikov // FIXME: since-cxx17-error@-1 {{static_cast from 'void (*)() throw(int)' to 'void (*)() throw()' is not allowed}} 1331d358b2deSVlad Serebrennikov // 1332d358b2deSVlad Serebrennikov // Irony: the above is valid in C++17 and beyond, but that's exactly when 1333d358b2deSVlad Serebrennikov // we reject it. In C++14 and before, this is ill-formed because an 1334d358b2deSVlad Serebrennikov // exception-specification is not permitted in a type-id. In C++17, this is 1335d358b2deSVlad Serebrennikov // valid because it's the inverse of a standard conversion sequence 1336d358b2deSVlad Serebrennikov // containing a function pointer conversion. (Well, it's actually not valid 1337d358b2deSVlad Serebrennikov // yet, as a static_cast is not permitted to reverse a function pointer 1338d358b2deSVlad Serebrennikov // conversion, but that is being changed by core issue). 1339d358b2deSVlad Serebrennikov (void)static_cast<void (*)() throw(int)>(f); // FIXME: ill-formed in C++14 and before 1340d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 1341d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 1342d358b2deSVlad Serebrennikov 1343d358b2deSVlad Serebrennikov void (*p)() throw() = f; 1344d358b2deSVlad Serebrennikov // cxx98-14-error@-1 {{target exception specification is not superset of source}} 1345d358b2deSVlad Serebrennikov // since-cxx17-error@-2 {{cannot initialize a variable of type 'void (*)() throw()' with an lvalue of type 'void () throw(int)': different exception specifications}} 1346d358b2deSVlad Serebrennikov void (*q)() throw(int) = f; 1347d358b2deSVlad Serebrennikov // since-cxx17-error@-1 {{ISO C++17 does not allow dynamic exception specifications}} 1348d358b2deSVlad Serebrennikov // since-cxx17-note@-2 {{use 'noexcept(false)' instead}} 1349d358b2deSVlad Serebrennikov } 1350463e61a0SVlad Serebrennikov } // namespace cwg294 1351d358b2deSVlad Serebrennikov 1352d358b2deSVlad Serebrennikov namespace cwg295 { // cwg295: 3.7 1353d358b2deSVlad Serebrennikov typedef int f(); 1354d358b2deSVlad Serebrennikov const f g; 1355d358b2deSVlad Serebrennikov // expected-warning@-1 {{'const' qualifier on function type 'f' (aka 'int ()') has no effect}} 1356d358b2deSVlad Serebrennikov f &r = g; 1357d358b2deSVlad Serebrennikov template<typename T> struct X { 1358d358b2deSVlad Serebrennikov const T &f; 1359d358b2deSVlad Serebrennikov }; 1360d358b2deSVlad Serebrennikov X<f> x = {g}; 1361d358b2deSVlad Serebrennikov 1362d358b2deSVlad Serebrennikov typedef int U(); 1363d358b2deSVlad Serebrennikov typedef const U U; 1364d358b2deSVlad Serebrennikov // expected-warning@-1 {{'const' qualifier on function type 'U' (aka 'int ()') has no effect}} 1365d358b2deSVlad Serebrennikov 1366d358b2deSVlad Serebrennikov typedef int (*V)(); 1367d358b2deSVlad Serebrennikov typedef volatile U *V; 1368d358b2deSVlad Serebrennikov // expected-warning@-1 {{'volatile' qualifier on function type 'U' (aka 'int ()') has no effect}} 1369463e61a0SVlad Serebrennikov } // namespace cwg295 1370d358b2deSVlad Serebrennikov 137114ba3f9dSVlad Serebrennikov namespace cwg296 { // cwg296: 2.7 1372d358b2deSVlad Serebrennikov struct A { 1373d358b2deSVlad Serebrennikov static operator int() { return 0; } 1374d358b2deSVlad Serebrennikov // expected-error@-1 {{conversion function must be a non-static member function}} 1375d358b2deSVlad Serebrennikov }; 1376463e61a0SVlad Serebrennikov } // namespace cwg296 1377d358b2deSVlad Serebrennikov 1378d358b2deSVlad Serebrennikov namespace cwg298 { // cwg298: 3.1 1379d358b2deSVlad Serebrennikov struct A { 1380d358b2deSVlad Serebrennikov typedef int type; 1381d358b2deSVlad Serebrennikov A(); 1382d358b2deSVlad Serebrennikov ~A(); 1383d358b2deSVlad Serebrennikov }; 1384d358b2deSVlad Serebrennikov typedef A B; // #cwg298-B 1385d358b2deSVlad Serebrennikov typedef const A C; // #cwg298-C 1386d358b2deSVlad Serebrennikov 1387d358b2deSVlad Serebrennikov A::type i1; 1388d358b2deSVlad Serebrennikov B::type i2; 1389d358b2deSVlad Serebrennikov C::type i3; 1390d358b2deSVlad Serebrennikov 1391d358b2deSVlad Serebrennikov struct A a; 1392d358b2deSVlad Serebrennikov struct B b; 1393bbddedb3Skper // expected-error@-1 {{typedef 'B' cannot be referenced with the 'struct' specifier}} 1394d358b2deSVlad Serebrennikov // expected-note@#cwg298-B {{declared here}} 1395d358b2deSVlad Serebrennikov struct C c; 1396bbddedb3Skper // expected-error@-1 {{typedef 'C' cannot be referenced with the 'struct' specifier}} 1397d358b2deSVlad Serebrennikov // expected-note@#cwg298-C {{declared here}} 1398d358b2deSVlad Serebrennikov 1399d358b2deSVlad Serebrennikov B::B() {} 1400d358b2deSVlad Serebrennikov // expected-error@-1 {{a type specifier is required for all declarations}} 1401d358b2deSVlad Serebrennikov B::A() {} // ok 1402d358b2deSVlad Serebrennikov C::~C() {} 1403d358b2deSVlad Serebrennikov // expected-error@-1 {{destructor cannot be declared using a typedef 'C' (aka 'const cwg298::A') of the class name}} 1404d358b2deSVlad Serebrennikov 1405d358b2deSVlad Serebrennikov typedef struct D E; // #cwg298-E 1406d358b2deSVlad Serebrennikov struct E {}; 1407d358b2deSVlad Serebrennikov // expected-error@-1 {{definition of type 'E' conflicts with typedef of the same name}} 1408d358b2deSVlad Serebrennikov // expected-note@#cwg298-E {{'E' declared here}} 1409d358b2deSVlad Serebrennikov 1410d358b2deSVlad Serebrennikov struct F { 1411d358b2deSVlad Serebrennikov ~F(); 1412d358b2deSVlad Serebrennikov }; 1413d358b2deSVlad Serebrennikov typedef const F G; 1414d358b2deSVlad Serebrennikov G::~F() {} // ok 1415463e61a0SVlad Serebrennikov } // namespace cwg298 1416d358b2deSVlad Serebrennikov 1417d358b2deSVlad Serebrennikov namespace cwg299 { // cwg299: 2.8 c++11 1418d358b2deSVlad Serebrennikov struct S { 1419d358b2deSVlad Serebrennikov operator int(); 1420d358b2deSVlad Serebrennikov }; 1421d358b2deSVlad Serebrennikov struct T { 1422d358b2deSVlad Serebrennikov operator int(); // #cwg299-int 1423d358b2deSVlad Serebrennikov operator unsigned short(); // #cwg299-ushort 1424d358b2deSVlad Serebrennikov }; 1425d358b2deSVlad Serebrennikov // FIXME: should this apply to c++98 mode? 1426d358b2deSVlad Serebrennikov int *p = new int[S()]; 1427d358b2deSVlad Serebrennikov // cxx98-error@-1 {{implicit conversion from array size expression of type 'S' to integral type 'int' is a C++11 extension}} 1428d358b2deSVlad Serebrennikov int *q = new int[T()]; // #cwg299-q 1429d358b2deSVlad Serebrennikov // cxx98-11-error@#cwg299-q {{ambiguous conversion of array size expression of type 'T' to an integral or enumeration type}} 1430d358b2deSVlad Serebrennikov // cxx98-11-note@#cwg299-int {{conversion to integral type 'int' declared here}} 1431d358b2deSVlad Serebrennikov // cxx98-11-note@#cwg299-ushort {{conversion to integral type 'unsigned short' declared here}} 1432d358b2deSVlad Serebrennikov // since-cxx14-error-re@#cwg299-q {{{{conversion from 'T' to 'unsigned (long long|long|int)' is ambiguous}}}} 1433d358b2deSVlad Serebrennikov // since-cxx14-note@#cwg299-int {{candidate function}} 1434d358b2deSVlad Serebrennikov // since-cxx14-note@#cwg299-ushort {{candidate function}} 1435463e61a0SVlad Serebrennikov } // namespace cwg299 1436