xref: /aosp_15_r20/external/clang/test/CXX/drs/dr9xx.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 #if __cplusplus < 201103L
7*67e74705SXin Li // expected-no-diagnostics
8*67e74705SXin Li #endif
9*67e74705SXin Li 
10*67e74705SXin Li namespace std {
11*67e74705SXin Li   __extension__ typedef __SIZE_TYPE__ size_t;
12*67e74705SXin Li 
13*67e74705SXin Li   template<typename T> struct initializer_list {
14*67e74705SXin Li     const T *p; size_t n;
15*67e74705SXin Li     initializer_list(const T *p, size_t n);
16*67e74705SXin Li   };
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li namespace dr990 { // dr990: 3.5
20*67e74705SXin Li #if __cplusplus >= 201103L
21*67e74705SXin Li   struct A { // expected-note 2{{candidate}}
22*67e74705SXin Li     A(std::initializer_list<int>); // expected-note {{candidate}}
23*67e74705SXin Li   };
24*67e74705SXin Li   struct B {
25*67e74705SXin Li     A a;
26*67e74705SXin Li   };
27*67e74705SXin Li   B b1 { };
28*67e74705SXin Li   B b2 { 1 }; // expected-error {{no viable conversion from 'int' to 'dr990::A'}}
29*67e74705SXin Li   B b3 { { 1 } };
30*67e74705SXin Li 
31*67e74705SXin Li   struct C {
32*67e74705SXin Li     C();
33*67e74705SXin Li     C(int);
34*67e74705SXin Li     C(std::initializer_list<int>) = delete; // expected-note {{here}}
35*67e74705SXin Li   };
36*67e74705SXin Li   C c1[3] { 1 }; // ok
37*67e74705SXin Li   C c2[3] { 1, {2} }; // expected-error {{call to deleted}}
38*67e74705SXin Li 
39*67e74705SXin Li   struct D {
40*67e74705SXin Li     D();
41*67e74705SXin Li     D(std::initializer_list<int>);
42*67e74705SXin Li     D(std::initializer_list<double>);
43*67e74705SXin Li   };
44*67e74705SXin Li   D d{};
45*67e74705SXin Li #endif
46*67e74705SXin Li }
47*67e74705SXin Li 
48*67e74705SXin Li namespace dr948 { // dr948: 3.7
49*67e74705SXin Li #if __cplusplus >= 201103L
50*67e74705SXin Li   class A {
51*67e74705SXin Li   public:
A(int v)52*67e74705SXin Li      constexpr A(int v) : v(v) { }
operator int() const53*67e74705SXin Li      constexpr operator int() const { return v; }
54*67e74705SXin Li   private:
55*67e74705SXin Li      int v;
56*67e74705SXin Li   };
57*67e74705SXin Li 
id(int x)58*67e74705SXin Li   constexpr int id(int x)
59*67e74705SXin Li   {
60*67e74705SXin Li     return x;
61*67e74705SXin Li   }
62*67e74705SXin Li 
f()63*67e74705SXin Li   void f() {
64*67e74705SXin Li      if (constexpr int i = id(101)) { }
65*67e74705SXin Li      switch (constexpr int i = id(2)) { default: break; case 2: break; }
66*67e74705SXin Li      for (; constexpr int i = id(0); ) { }
67*67e74705SXin Li      while (constexpr int i = id(0)) { }
68*67e74705SXin Li 
69*67e74705SXin Li      if (constexpr A i = 101) { }
70*67e74705SXin Li      switch (constexpr A i = 2) { default: break; case 2: break; }
71*67e74705SXin Li      for (; constexpr A i = 0; ) { }
72*67e74705SXin Li      while (constexpr A i = 0) { }
73*67e74705SXin Li   }
74*67e74705SXin Li #endif
75*67e74705SXin Li }
76