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 dr1902 { // dr1902: 3.7 9*67e74705SXin Li struct A {}; 10*67e74705SXin Li struct B { 11*67e74705SXin Li B(A); 12*67e74705SXin Li #if __cplusplus >= 201103L 13*67e74705SXin Li // expected-note@-2 {{candidate}} 14*67e74705SXin Li #endif 15*67e74705SXin Li 16*67e74705SXin Li B() = delete; 17*67e74705SXin Li #if __cplusplus < 201103L 18*67e74705SXin Li // expected-error@-2 {{extension}} 19*67e74705SXin Li #endif 20*67e74705SXin Li 21*67e74705SXin Li B(const B&) // expected-note {{deleted here}} 22*67e74705SXin Li #if __cplusplus >= 201103L 23*67e74705SXin Li // expected-note@-2 {{candidate}} 24*67e74705SXin Li #else 25*67e74705SXin Li // expected-error@+2 {{extension}} 26*67e74705SXin Li #endif 27*67e74705SXin Li = delete; 28*67e74705SXin Li 29*67e74705SXin Li operator A(); 30*67e74705SXin Li }; 31*67e74705SXin Li 32*67e74705SXin Li extern B b1; 33*67e74705SXin Li B b2(b1); // expected-error {{call to deleted}} 34*67e74705SXin Li 35*67e74705SXin Li #if __cplusplus >= 201103L 36*67e74705SXin Li // This is ambiguous, even though calling the B(const B&) constructor would 37*67e74705SXin Li // both directly and indirectly call a deleted function. 38*67e74705SXin Li B b({}); // expected-error {{ambiguous}} 39*67e74705SXin Li #endif 40*67e74705SXin Li } 41*67e74705SXin Li 42*67e74705SXin Li namespace dr1903 { 43*67e74705SXin Li namespace A { 44*67e74705SXin Li struct a {}; 45*67e74705SXin Li int a; 46*67e74705SXin Li namespace B { 47*67e74705SXin Li int b; 48*67e74705SXin Li } 49*67e74705SXin Li using namespace B; 50*67e74705SXin Li namespace { 51*67e74705SXin Li int c; 52*67e74705SXin Li } 53*67e74705SXin Li namespace D { 54*67e74705SXin Li int d; 55*67e74705SXin Li } 56*67e74705SXin Li using D::d; 57*67e74705SXin Li } 58*67e74705SXin Li namespace X { 59*67e74705SXin Li using A::a; 60*67e74705SXin Li using A::b; 61*67e74705SXin Li using A::c; 62*67e74705SXin Li using A::d; 63*67e74705SXin Li struct a *p; 64*67e74705SXin Li } 65*67e74705SXin Li } 66*67e74705SXin Li 67*67e74705SXin Li namespace dr1909 { // dr1909: yes 68*67e74705SXin Li struct A { 69*67e74705SXin Li template<typename T> struct A {}; // expected-error {{member 'A' has the same name as its class}} 70*67e74705SXin Li }; 71*67e74705SXin Li struct B { Bdr1909::B72*67e74705SXin Li template<typename T> void B() {} // expected-error {{constructor cannot have a return type}} 73*67e74705SXin Li }; 74*67e74705SXin Li struct C { 75*67e74705SXin Li template<typename T> static int C; // expected-error {{member 'C' has the same name as its class}} expected-error 0-1{{extension}} 76*67e74705SXin Li }; 77*67e74705SXin Li struct D { 78*67e74705SXin Li template<typename T> using D = int; // expected-error {{member 'D' has the same name as its class}} expected-error 0-1{{extension}} 79*67e74705SXin Li }; 80*67e74705SXin Li } 81*67e74705SXin Li 82*67e74705SXin Li namespace dr1940 { // dr1940: yes 83*67e74705SXin Li #if __cplusplus >= 201103L 84*67e74705SXin Li static union { 85*67e74705SXin Li static_assert(true, ""); // ok 86*67e74705SXin Li static_assert(false, ""); // expected-error {{static_assert failed}} 87*67e74705SXin Li }; 88*67e74705SXin Li #endif 89*67e74705SXin Li } 90*67e74705SXin Li 91*67e74705SXin Li namespace dr1941 { // dr1941: 3.9 92*67e74705SXin Li #if __cplusplus >= 201402L 93*67e74705SXin Li template<typename X> 94*67e74705SXin Li struct base { 95*67e74705SXin Li template<typename T> 96*67e74705SXin Li base(T a, T b, decltype(void(*T()), 0) = 0) { 97*67e74705SXin Li while (a != b) (void)*a++; 98*67e74705SXin Li } 99*67e74705SXin Li 100*67e74705SXin Li template<typename T> 101*67e74705SXin Li base(T a, X x, decltype(void(T(0) * 1), 0) = 0) { 102*67e74705SXin Li for (T n = 0; n != a; ++n) (void)X(x); 103*67e74705SXin Li } 104*67e74705SXin Li }; 105*67e74705SXin Li 106*67e74705SXin Li struct derived : base<int> { 107*67e74705SXin Li using base::base; 108*67e74705SXin Li }; 109*67e74705SXin Li 110*67e74705SXin Li struct iter { 111*67e74705SXin Li iter operator++(int); 112*67e74705SXin Li int operator*(); 113*67e74705SXin Li friend bool operator!=(iter, iter); 114*67e74705SXin Li } it, end; 115*67e74705SXin Li 116*67e74705SXin Li derived d1(it, end); 117*67e74705SXin Li derived d2(42, 9); 118*67e74705SXin Li #endif 119*67e74705SXin Li } 120*67e74705SXin Li 121*67e74705SXin Li namespace dr1947 { // dr1947: yes 122*67e74705SXin Li #if __cplusplus >= 201402L 123*67e74705SXin Li unsigned o = 0'01; // ok 124*67e74705SXin Li unsigned b = 0b'01; // expected-error {{invalid digit 'b' in octal constant}} 125*67e74705SXin Li unsigned x = 0x'01; // expected-error {{invalid suffix 'x'01' on integer constant}} 126*67e74705SXin Li #endif 127*67e74705SXin Li } 128*67e74705SXin Li 129*67e74705SXin Li #if __cplusplus >= 201103L 130*67e74705SXin Li // dr1948: yes 131*67e74705SXin Li // FIXME: This diagnostic could be improved. 132*67e74705SXin Li void *operator new(__SIZE_TYPE__) noexcept { return nullptr; } // expected-error{{exception specification in declaration does not match previous declaration}} 133*67e74705SXin Li #endif 134*67e74705SXin Li 135*67e74705SXin Li namespace dr1959 { // dr1959: 3.9 136*67e74705SXin Li #if __cplusplus >= 201103L 137*67e74705SXin Li struct b; 138*67e74705SXin Li struct c; 139*67e74705SXin Li struct a { 140*67e74705SXin Li a() = default; 141*67e74705SXin Li a(const a &) = delete; // expected-note 2{{deleted}} 142*67e74705SXin Li a(const b &) = delete; // not inherited 143*67e74705SXin Li a(c &&) = delete; // expected-note {{deleted}} 144*67e74705SXin Li template<typename T> a(T) = delete; 145*67e74705SXin Li }; 146*67e74705SXin Li 147*67e74705SXin Li struct b : a { // expected-note {{copy constructor of 'b' is implicitly deleted because base class 'dr1959::a' has a deleted copy constructor}} 148*67e74705SXin Li using a::a; 149*67e74705SXin Li }; 150*67e74705SXin Li 151*67e74705SXin Li a x; 152*67e74705SXin Li b y = x; // expected-error {{deleted}} 153*67e74705SXin Li b z = z; // expected-error {{deleted}} 154*67e74705SXin Li 155*67e74705SXin Li // FIXME: It's not really clear that this matches the intent, but it's 156*67e74705SXin Li // consistent with the behavior for assignment operators. 157*67e74705SXin Li struct c : a { 158*67e74705SXin Li using a::a; 159*67e74705SXin Li c(const c &); 160*67e74705SXin Li }; 161*67e74705SXin Li c q(static_cast<c&&>(q)); // expected-error {{call to deleted}} 162*67e74705SXin Li #endif 163*67e74705SXin Li } 164*67e74705SXin Li 165*67e74705SXin Li namespace dr1968 { // dr1968: yes 166*67e74705SXin Li #if __cplusplus >= 201103L 167*67e74705SXin Li static_assert(&typeid(int) == &typeid(int), ""); // expected-error{{not an integral constant expression}} 168*67e74705SXin Li #endif 169*67e74705SXin Li } 170*67e74705SXin Li 171*67e74705SXin Li namespace dr1991 { // dr1991: 3.9 172*67e74705SXin Li #if __cplusplus >= 201103L 173*67e74705SXin Li struct A { 174*67e74705SXin Li A(int, int) = delete; 175*67e74705SXin Li }; 176*67e74705SXin Li 177*67e74705SXin Li struct B : A { 178*67e74705SXin Li using A::A; 179*67e74705SXin Li B(int, int, int = 0); 180*67e74705SXin Li }; 181*67e74705SXin Li 182*67e74705SXin Li // FIXME: As a resolution to an open DR against P0136R1, we treat derived 183*67e74705SXin Li // class constructors as better than base class constructors in the presence 184*67e74705SXin Li // of ambiguity. 185*67e74705SXin Li B b(0, 0); // ok, calls B constructor 186*67e74705SXin Li #endif 187*67e74705SXin Li } 188*67e74705SXin Li 189*67e74705SXin Li // dr1994: dup 529 190