1*67e74705SXin Li // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 2*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 3*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 4*67e74705SXin Li // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 5*67e74705SXin Li 6*67e74705SXin Li namespace std { struct type_info {}; } 7*67e74705SXin Li 8*67e74705SXin Li namespace dr601 { // dr601: yes 9*67e74705SXin Li #if __cplusplus >= 201103L 10*67e74705SXin Li #define MAX __LLONG_MAX__ 11*67e74705SXin Li #else 12*67e74705SXin Li #define MAX __LONG_MAX__ 13*67e74705SXin Li #endif 14*67e74705SXin Li 15*67e74705SXin Li #if 0x8000 < -1 16*67e74705SXin Li #error 0x8000 should be signed 17*67e74705SXin Li #endif 18*67e74705SXin Li 19*67e74705SXin Li #if MAX > 0xFFFFFFFF && 0x80000000 < -1 20*67e74705SXin Li #error 0x80000000 should be signed 21*67e74705SXin Li #endif 22*67e74705SXin Li 23*67e74705SXin Li #if __INT_MAX__ == 0x7FFFFFFF 24*67e74705SXin Li _Static_assert(0x80000000 < -1, "0x80000000 should be unsigned"); // expected-error {{C11}} 25*67e74705SXin Li #endif 26*67e74705SXin Li 27*67e74705SXin Li #if MAX > 0xFFFFFFFFFFFFFFFF && 0x8000000000000000 < -1 28*67e74705SXin Li #error 0x8000000000000000 should be signed 29*67e74705SXin Li #endif 30*67e74705SXin Li 31*67e74705SXin Li #if __cplusplus >= 201103L && __LLONG_MAX__ == 0x7FFFFFFFFFFFFFFF 32*67e74705SXin Li static_assert(0x8000000000000000 < -1, "0x8000000000000000 should be unsigned"); // expected-error {{C11}} 33*67e74705SXin Li #endif 34*67e74705SXin Li 35*67e74705SXin Li #undef MAX 36*67e74705SXin Li } 37*67e74705SXin Li 38*67e74705SXin Li namespace dr602 { // dr602: yes 39*67e74705SXin Li template<class T> struct A { 40*67e74705SXin Li template<class U> friend struct A; 41*67e74705SXin Li }; 42*67e74705SXin Li 43*67e74705SXin Li template<class T> struct B { 44*67e74705SXin Li class C { 45*67e74705SXin Li template<class U> friend struct B; 46*67e74705SXin Li typedef int type; 47*67e74705SXin Li }; 48*67e74705SXin Li typename C::type ct; // ok, befriended 49*67e74705SXin Li }; 50*67e74705SXin Li B<int> b; 51*67e74705SXin Li } 52*67e74705SXin Li 53*67e74705SXin Li namespace dr603 { // dr603: yes 54*67e74705SXin Li template<unsigned char> struct S {}; 55*67e74705SXin Li typedef S<'\001'> S1; 56*67e74705SXin Li typedef S<(1ul << __CHAR_BIT__) + 1> S1; 57*67e74705SXin Li #if __cplusplus >= 201103L 58*67e74705SXin Li // expected-error@-2 {{cannot be narrowed}} 59*67e74705SXin Li #endif 60*67e74705SXin Li } 61*67e74705SXin Li 62*67e74705SXin Li // dr604: na 63*67e74705SXin Li // dr605 needs IRGen test 64*67e74705SXin Li 65*67e74705SXin Li namespace dr606 { // dr606: yes 66*67e74705SXin Li #if __cplusplus >= 201103L 67*67e74705SXin Li template<typename T> struct S {}; 68*67e74705SXin Li template<typename T> void f(S<T> &&); // expected-note {{no known conversion from 'S<int>' to 'S<int> &&'}} 69*67e74705SXin Li template<typename T> void g(T &&); 70*67e74705SXin Li template<typename T> void h(const T &&); // expected-note {{no known conversion from 'S<int>' to 'const dr606::S<int> &&'}} 71*67e74705SXin Li test(S<int> s)72*67e74705SXin Li void test(S<int> s) { 73*67e74705SXin Li f(s); // expected-error {{no match}} 74*67e74705SXin Li g(s); 75*67e74705SXin Li h(s); // expected-error {{no match}} 76*67e74705SXin Li 77*67e74705SXin Li g(test); 78*67e74705SXin Li h(test); // ok, an rvalue reference can bind to a function lvalue 79*67e74705SXin Li } 80*67e74705SXin Li #endif 81*67e74705SXin Li } 82*67e74705SXin Li 83*67e74705SXin Li namespace dr608 { // dr608: yes 84*67e74705SXin Li struct A { virtual void f(); }; 85*67e74705SXin Li struct B : A {}; 86*67e74705SXin Li struct C : A { void f(); }; 87*67e74705SXin Li struct D : B, C {}; 88*67e74705SXin Li } 89*67e74705SXin Li 90*67e74705SXin Li int dr610[-0u == 0u ? 1 : -1]; // dr610: yes 91*67e74705SXin Li 92*67e74705SXin Li namespace dr611 { // dr611: yes 93*67e74705SXin Li int k; 94*67e74705SXin Li struct S { int &r; } s = { k ? k : k }; 95*67e74705SXin Li } 96*67e74705SXin Li 97*67e74705SXin Li // dr612: na 98*67e74705SXin Li 99*67e74705SXin Li namespace dr613 { // dr613: yes c++11 100*67e74705SXin Li // see also n2253 101*67e74705SXin Li struct A { int n; static void f(); }; 102*67e74705SXin Li int f(int); 103*67e74705SXin Li struct B { virtual void f(); }; 104*67e74705SXin Li B &g(int); 105*67e74705SXin Li 106*67e74705SXin Li int an1 = sizeof(A::n); 107*67e74705SXin Li int an2 = sizeof(A::n + 1); // valid per dr850 108*67e74705SXin Li int an3 = sizeof A::n; 109*67e74705SXin Li int an4 = sizeof(f(A::n)); 110*67e74705SXin Li int an5 = sizeof(g(A::n)); 111*67e74705SXin Li const std::type_info &an6 = typeid(A::n); 112*67e74705SXin Li const std::type_info &an7 = typeid(A::n + 1); 113*67e74705SXin Li const std::type_info &an8 = typeid(f(A::n)); 114*67e74705SXin Li const std::type_info &an9 = typeid(g(A::n)); // expected-error {{non-static}} 115*67e74705SXin Li #if __cplusplus < 201103L 116*67e74705SXin Li // expected-error@-10 {{non-static}} 117*67e74705SXin Li // expected-error@-10 {{non-static}} 118*67e74705SXin Li // expected-error@-10 {{non-static}} 119*67e74705SXin Li // expected-error@-10 {{non-static}} 120*67e74705SXin Li // expected-error@-10 {{non-static}} 121*67e74705SXin Li // expected-error@-10 {{non-static}} 122*67e74705SXin Li // expected-error@-10 {{non-static}} 123*67e74705SXin Li // expected-error@-10 {{non-static}} 124*67e74705SXin Li #endif 125*67e74705SXin Li f()126*67e74705SXin Li void A::f() { 127*67e74705SXin Li int an1 = sizeof n; 128*67e74705SXin Li const std::type_info &an2 = typeid(n + 1); 129*67e74705SXin Li #if __cplusplus < 201103L 130*67e74705SXin Li // expected-error@-3 {{static}} 131*67e74705SXin Li // expected-error@-3 {{static}} 132*67e74705SXin Li #endif 133*67e74705SXin Li const std::type_info &an3 = typeid(g(n)); // expected-error {{static}} 134*67e74705SXin Li } 135*67e74705SXin Li } 136*67e74705SXin Li 137*67e74705SXin Li int dr614_a[(-1) / 2 == 0 ? 1 : -1]; // dr614: yes 138*67e74705SXin Li int dr614_b[(-1) % 2 == -1 ? 1 : -1]; 139*67e74705SXin Li 140*67e74705SXin Li namespace dr615 { // dr615: yes 141*67e74705SXin Li int f(); 142*67e74705SXin Li static int n = f(); 143*67e74705SXin Li } 144*67e74705SXin Li 145*67e74705SXin Li namespace dr616 { // dr616: no 146*67e74705SXin Li #if __cplusplus >= 201103L 147*67e74705SXin Li struct S { int n; } s; 148*67e74705SXin Li // FIXME: These should all be 'int &&' 149*67e74705SXin Li using T = decltype(S().n); // expected-note 2{{previous}} 150*67e74705SXin Li using T = decltype(static_cast<S&&>(s).n); 151*67e74705SXin Li using T = decltype(S().*&S::n); 152*67e74705SXin Li using T = decltype(static_cast<S&&>(s).*&S::n); // expected-error {{different type}} 153*67e74705SXin Li using T = int&&; // expected-error {{different type}} 154*67e74705SXin Li #endif 155*67e74705SXin Li } 156*67e74705SXin Li 157*67e74705SXin Li namespace dr618 { // dr618: yes 158*67e74705SXin Li #if (unsigned)-1 > 0 159*67e74705SXin Li #error wrong 160*67e74705SXin Li #endif 161*67e74705SXin Li } 162*67e74705SXin Li 163*67e74705SXin Li namespace dr619 { // dr619: yes 164*67e74705SXin Li extern int x[10]; 165*67e74705SXin Li struct S { static int x[10]; }; 166*67e74705SXin Li 167*67e74705SXin Li int x[]; 168*67e74705SXin Li _Static_assert(sizeof(x) == sizeof(int) * 10, ""); // expected-error {{C11}} 169*67e74705SXin Li extern int x[]; 170*67e74705SXin Li _Static_assert(sizeof(x) == sizeof(int) * 10, ""); // expected-error {{C11}} 171*67e74705SXin Li 172*67e74705SXin Li int S::x[]; 173*67e74705SXin Li _Static_assert(sizeof(S::x) == sizeof(int) * 10, ""); // expected-error {{C11}} 174*67e74705SXin Li f()175*67e74705SXin Li void f() { 176*67e74705SXin Li extern int x[]; 177*67e74705SXin Li sizeof(x); // expected-error {{incomplete}} 178*67e74705SXin Li } 179*67e74705SXin Li } 180*67e74705SXin Li 181*67e74705SXin Li // dr620: dup 568 182*67e74705SXin Li 183*67e74705SXin Li namespace dr621 { 184*67e74705SXin Li template<typename T> T f(); f()185*67e74705SXin Li template<> int f() {} // expected-note {{previous}} f()186*67e74705SXin Li template<> int f<int>() {} // expected-error {{redefinition}} 187*67e74705SXin Li } 188*67e74705SXin Li 189*67e74705SXin Li // dr623: na 190*67e74705SXin Li // FIXME: Add documentation saying we allow invalid pointer values. 191*67e74705SXin Li 192*67e74705SXin Li // dr624 needs an IRGen check. 193*67e74705SXin Li 194*67e74705SXin Li namespace dr625 { // dr625: yes 195*67e74705SXin Li template<typename T> struct A {}; 196*67e74705SXin Li A<auto> x = A<int>(); // expected-error {{'auto' not allowed in template argument}} expected-error 0-1{{extension}} 197*67e74705SXin Li void f(int); 198*67e74705SXin Li void (*p)(auto) = f; // expected-error {{'auto' not allowed in function prototype}} expected-error 0-1{{extension}} 199*67e74705SXin Li } 200*67e74705SXin Li 201*67e74705SXin Li namespace dr626 { // dr626: yes 202*67e74705SXin Li #define STR(x) #x 203*67e74705SXin Li char c[2] = STR(c); // ok, type matches 204*67e74705SXin Li wchar_t w[2] = STR(w); // expected-error {{initializing wide char array with non-wide string literal}} 205*67e74705SXin Li } 206*67e74705SXin Li 207*67e74705SXin Li namespace dr627 { // dr627: yes f()208*67e74705SXin Li void f() { 209*67e74705SXin Li true a = 0; // expected-error +{{}} expected-warning {{unused}} 210*67e74705SXin Li } 211*67e74705SXin Li } 212*67e74705SXin Li 213*67e74705SXin Li // dr628: na 214*67e74705SXin Li 215*67e74705SXin Li namespace dr629 { // dr629: yes 216*67e74705SXin Li typedef int T; 217*67e74705SXin Li int n = 1; f()218*67e74705SXin Li void f() { 219*67e74705SXin Li auto T = 2; 220*67e74705SXin Li #if __cplusplus < 201103L 221*67e74705SXin Li // expected-error@-2 {{expected unqualified-id}} 222*67e74705SXin Li #else 223*67e74705SXin Li // expected-note@-4 {{previous}} 224*67e74705SXin Li #endif 225*67e74705SXin Li 226*67e74705SXin Li auto T(n); 227*67e74705SXin Li #if __cplusplus >= 201103L 228*67e74705SXin Li // expected-error@-2 {{redefinition of 'T'}} 229*67e74705SXin Li #endif 230*67e74705SXin Li } 231*67e74705SXin Li } 232*67e74705SXin Li 233*67e74705SXin Li namespace dr630 { // dr630: yes 234*67e74705SXin Li const bool MB_EQ_WC = 235*67e74705SXin Li ' ' == L' ' && '\t' == L'\t' && '\v' == L'\v' && '\r' == L'\r' && 236*67e74705SXin Li '\n' == L'\n' && // 237*67e74705SXin Li 'a' == L'a' && 'b' == L'b' && 'c' == L'c' && 'd' == L'd' && 'e' == L'e' && 238*67e74705SXin Li 'f' == L'f' && 'g' == L'g' && 'h' == L'h' && 'i' == L'i' && 'j' == L'j' && 239*67e74705SXin Li 'k' == L'k' && 'l' == L'l' && 'm' == L'm' && 'n' == L'n' && 'o' == L'o' && 240*67e74705SXin Li 'p' == L'p' && 'q' == L'q' && 'r' == L'r' && 's' == L's' && 't' == L't' && 241*67e74705SXin Li 'u' == L'u' && 'v' == L'v' && 'w' == L'w' && 'x' == L'x' && 'y' == L'y' && 242*67e74705SXin Li 'z' == L'z' && // 243*67e74705SXin Li 'A' == L'A' && 'B' == L'B' && 'C' == L'C' && 'D' == L'D' && 'E' == L'E' && 244*67e74705SXin Li 'F' == L'F' && 'G' == L'G' && 'H' == L'H' && 'I' == L'I' && 'J' == L'J' && 245*67e74705SXin Li 'K' == L'K' && 'L' == L'L' && 'M' == L'M' && 'N' == L'N' && 'O' == L'O' && 246*67e74705SXin Li 'P' == L'P' && 'Q' == L'Q' && 'R' == L'R' && 'S' == L'S' && 'T' == L'T' && 247*67e74705SXin Li 'U' == L'U' && 'V' == L'V' && 'W' == L'W' && 'X' == L'X' && 'Y' == L'Y' && 248*67e74705SXin Li 'Z' == L'Z' && // 249*67e74705SXin Li '0' == L'0' && '1' == L'1' && '2' == L'2' && '3' == L'3' && '4' == L'4' && 250*67e74705SXin Li '5' == L'5' && '6' == L'6' && '7' == L'7' && '8' == L'8' && 251*67e74705SXin Li '9' == L'9' && // 252*67e74705SXin Li '_' == L'_' && '{' == L'{' && '}' == L'}' && '[' == L'[' && ']' == L']' && 253*67e74705SXin Li '#' == L'#' && '(' == L'(' && ')' == L')' && '<' == L'<' && '>' == L'>' && 254*67e74705SXin Li '%' == L'%' && ':' == L':' && ';' == L';' && '.' == L'.' && '?' == L'?' && 255*67e74705SXin Li '*' == L'*' && '+' == L'+' && '-' == L'-' && '/' == L'/' && '^' == L'^' && 256*67e74705SXin Li '&' == L'&' && '|' == L'|' && '~' == L'~' && '!' == L'!' && '=' == L'=' && 257*67e74705SXin Li ',' == L',' && '\\' == L'\\' && '"' == L'"' && '\'' == L'\''; 258*67e74705SXin Li #if __STDC_MB_MIGHT_NEQ_WC__ 259*67e74705SXin Li #ifndef __FreeBSD__ // PR22208, FreeBSD expects us to give a bad (but conforming) answer here. 260*67e74705SXin Li _Static_assert(!MB_EQ_WC, "__STDC_MB_MIGHT_NEQ_WC__ but all basic source characters have same representation"); // expected-error {{C11}} 261*67e74705SXin Li #endif 262*67e74705SXin Li #else 263*67e74705SXin Li _Static_assert(MB_EQ_WC, "!__STDC_MB_MIGHT_NEQ_WC__ but some character differs"); // expected-error {{C11}} 264*67e74705SXin Li #endif 265*67e74705SXin Li } 266*67e74705SXin Li 267*67e74705SXin Li // dr631: na 268*67e74705SXin Li 269*67e74705SXin Li namespace dr632 { // dr632: yes 270*67e74705SXin Li struct S { int n; } s = {{5}}; // expected-warning {{braces}} 271*67e74705SXin Li } 272*67e74705SXin Li 273*67e74705SXin Li // dr633: na 274*67e74705SXin Li // see also n2993 275*67e74705SXin Li 276*67e74705SXin Li namespace dr634 { // dr634: yes 277*67e74705SXin Li struct S { S(); S(const S&); virtual void f(); ~S(); }; 278*67e74705SXin Li int f(...); 279*67e74705SXin Li char f(int); 280*67e74705SXin Li template<typename T> int (&g(T))[sizeof f(T())]; 281*67e74705SXin Li int (&a)[sizeof(int)] = g(S()); 282*67e74705SXin Li int (&b)[1] = g(0); 283*67e74705SXin Li int k = f(S()); // expected-error {{cannot pass}} 284*67e74705SXin Li } 285*67e74705SXin Li 286*67e74705SXin Li namespace dr635 { // dr635: yes 287*67e74705SXin Li template<typename T> struct A { A(); ~A(); }; A()288*67e74705SXin Li template<typename T> A<T>::A<T>() {} // expected-error {{cannot have template arguments}} ~A()289*67e74705SXin Li template<typename T> A<T>::~A<T>() {} 290*67e74705SXin Li 291*67e74705SXin Li template<typename T> struct B { B(); ~B(); }; B()292*67e74705SXin Li template<typename T> B<T>::B() {} ~B()293*67e74705SXin Li template<typename T> B<T>::~B() {} 294*67e74705SXin Li 295*67e74705SXin Li struct C { template<typename T> C(); C(); }; C()296*67e74705SXin Li template<typename T> C::C() {} C()297*67e74705SXin Li C::C() {} C()298*67e74705SXin Li template<> C::C<int>() {} // expected-error {{constructor name}} expected-error {{unqualified-id}} 299*67e74705SXin Li /*FIXME: needed for error recovery:*/; 300*67e74705SXin Li 301*67e74705SXin Li template<typename T> struct D { template<typename U> D(); D(); }; D()302*67e74705SXin Li template<typename T> D<T>::D() {} // expected-note {{previous}} D()303*67e74705SXin Li template<typename T> template<typename U> D<T>::D() {} D()304*67e74705SXin Li template<typename T> D<T>::D<T>() {} // expected-error {{redefinition}} expected-error {{cannot have template arg}} 305*67e74705SXin Li } 306*67e74705SXin Li 307*67e74705SXin Li namespace dr637 { // dr637: yes f(int i)308*67e74705SXin Li void f(int i) { 309*67e74705SXin Li i = ++i + 1; 310*67e74705SXin Li i = i++ + 1; // expected-warning {{unsequenced}} 311*67e74705SXin Li } 312*67e74705SXin Li } 313*67e74705SXin Li 314*67e74705SXin Li namespace dr638 { // dr638: no 315*67e74705SXin Li template<typename T> struct A { 316*67e74705SXin Li struct B; 317*67e74705SXin Li void f(); 318*67e74705SXin Li void g(); 319*67e74705SXin Li struct C { 320*67e74705SXin Li void h(); 321*67e74705SXin Li }; 322*67e74705SXin Li }; 323*67e74705SXin Li 324*67e74705SXin Li class X { 325*67e74705SXin Li typedef int type; 326*67e74705SXin Li template<class T> friend struct A<T>::B; // expected-warning {{not supported}} 327*67e74705SXin Li template<class T> friend void A<T>::f(); // expected-warning {{not supported}} 328*67e74705SXin Li template<class T> friend void A<T>::g(); // expected-warning {{not supported}} 329*67e74705SXin Li template<class T> friend void A<T>::C::h(); // expected-warning {{not supported}} 330*67e74705SXin Li }; 331*67e74705SXin Li 332*67e74705SXin Li template<> struct A<int> { 333*67e74705SXin Li X::type a; // FIXME: private 334*67e74705SXin Li struct B { 335*67e74705SXin Li X::type b; // ok 336*67e74705SXin Li }; fdr638::A337*67e74705SXin Li int f() { X::type c; } // FIXME: private gdr638::A338*67e74705SXin Li void g() { X::type d; } // ok 339*67e74705SXin Li struct D { hdr638::A::D340*67e74705SXin Li void h() { X::type e; } // FIXME: private 341*67e74705SXin Li }; 342*67e74705SXin Li }; 343*67e74705SXin Li } 344*67e74705SXin Li 345*67e74705SXin Li namespace dr639 { // dr639: yes f(int i)346*67e74705SXin Li void f(int i) { 347*67e74705SXin Li void((i = 0) + (i = 0)); // expected-warning {{unsequenced}} 348*67e74705SXin Li } 349*67e74705SXin Li } 350