xref: /aosp_15_r20/external/clang/test/CXX/drs/dr19xx.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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