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