• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
2 // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
3 // RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
4 
5 #if __cplusplus < 201103L
6 // expected-no-diagnostics
7 #endif
8 
9 namespace dr1460 { // dr1460: 3.5
10 #if __cplusplus >= 201103L
11   namespace DRExample {
12     union A {
13       union {};
14       union {};
A()15       constexpr A() {}
16     };
17     constexpr A a = A();
18 
19     union B {
20       union {};
21       union {};
22       constexpr B() = default;
23     };
24     constexpr B b = B();
25 
26     union C {
27       union {};
28       union {};
29     };
30     constexpr C c = C();
31 #if __cplusplus > 201103L
f()32     constexpr void f() { C c; }
33     static_assert((f(), true), "");
34 #endif
35   }
36 
37   union A {};
38   union B { int n; }; // expected-note +{{here}}
39   union C { int n = 0; };
40   struct D { union {}; };
41   struct E { union { int n; }; }; // expected-note +{{here}}
42   struct F { union { int n = 0; }; };
43 
44   struct X {
45     friend constexpr A::A() noexcept;
46     friend constexpr B::B() noexcept; // expected-error {{follows non-constexpr declaration}}
47     friend constexpr C::C() noexcept;
48     friend constexpr D::D() noexcept;
49     friend constexpr E::E() noexcept; // expected-error {{follows non-constexpr declaration}}
50     friend constexpr F::F() noexcept;
51   };
52 
53   // These are OK, because value-initialization doesn't actually invoke the
54   // constructor.
55   constexpr A a = A();
56   constexpr B b = B();
57   constexpr C c = C();
58   constexpr D d = D();
59   constexpr E e = E();
60   constexpr F f = F();
61 
62   namespace Defaulted {
63     union A { constexpr A() = default; };
64     union B { int n; constexpr B() = default; }; // expected-error {{not constexpr}}
65     union C { int n = 0; constexpr C() = default; };
66     struct D { union {}; constexpr D() = default; };
67     struct E { union { int n; }; constexpr E() = default; }; // expected-error {{not constexpr}}
68     struct F { union { int n = 0; }; constexpr F() = default; };
69 
70     struct G { union { int n = 0; }; union { int m; }; constexpr G() = default; }; // expected-error {{not constexpr}}
71     struct H {
72       union {
73         int n = 0;
74       };
75       union { // expected-note 2{{member not initialized}}
76         int m;
77       };
Hdr1460::Defaulted::H78       constexpr H() {} // expected-error {{must initialize all members}}
Hdr1460::Defaulted::H79       constexpr H(bool) : m(1) {}
Hdr1460::Defaulted::H80       constexpr H(char) : n(1) {} // expected-error {{must initialize all members}}
Hdr1460::Defaulted::H81       constexpr H(double) : m(1), n(1) {}
82     };
83   }
84 
85 #if __cplusplus > 201103L
check()86   template<typename T> constexpr bool check() {
87     T t; // expected-note-re 2{{non-constexpr constructor '{{[BE]}}'}}
88     return true;
89   }
90   static_assert(check<A>(), "");
91   static_assert(check<B>(), ""); // expected-error {{constant}} expected-note {{in call}}
92   static_assert(check<C>(), "");
93   static_assert(check<D>(), "");
94   static_assert(check<E>(), ""); // expected-error {{constant}} expected-note {{in call}}
95   static_assert(check<F>(), "");
96 #endif
97 
98   union G {
99     int a = 0; // expected-note {{previous initialization is here}}
100     int b = 0; // expected-error {{initializing multiple members of union}}
101   };
102   union H {
103     union {
104       int a = 0; // expected-note {{previous initialization is here}}
105     };
106     union {
107       int b = 0; // expected-error {{initializing multiple members of union}}
108     };
109   };
110   struct I {
111     union {
112       int a = 0; // expected-note {{previous initialization is here}}
113       int b = 0; // expected-error {{initializing multiple members of union}}
114     };
115   };
116   struct J {
117     union { int a = 0; };
118     union { int b = 0; };
119   };
120 
121   namespace Overriding {
122     struct A {
123       int a = 1, b, c = 3;
Adr1460::Overriding::A124       constexpr A() : b(2) {}
125     };
126     static_assert(A().a == 1 && A().b == 2 && A().c == 3, "");
127 
128     union B {
129       int a, b = 2, c;
B()130       constexpr B() : a(1) {}
B(char)131       constexpr B(char) : b(4) {}
B(int)132       constexpr B(int) : c(3) {}
B(const char *)133       constexpr B(const char*) {}
134     };
135     static_assert(B().a == 1, "");
136     static_assert(B().b == 2, ""); // expected-error {{constant}} expected-note {{read of}}
137     static_assert(B('x').a == 0, ""); // expected-error {{constant}} expected-note {{read of}}
138     static_assert(B('x').b == 4, "");
139     static_assert(B(123).b == 2, ""); // expected-error {{constant}} expected-note {{read of}}
140     static_assert(B(123).c == 3, "");
141     static_assert(B("").a == 1, ""); // expected-error {{constant}} expected-note {{read of}}
142     static_assert(B("").b == 2, "");
143     static_assert(B("").c == 3, ""); // expected-error {{constant}} expected-note {{read of}}
144 
145     struct C {
146       union { int a, b = 2, c; };
147       union { int d, e = 5, f; };
Cdr1460::Overriding::C148       constexpr C() : a(1) {}
Cdr1460::Overriding::C149       constexpr C(char) : c(3) {}
Cdr1460::Overriding::C150       constexpr C(int) : d(4) {}
Cdr1460::Overriding::C151       constexpr C(float) : f(6) {}
Cdr1460::Overriding::C152       constexpr C(const char*) {}
153     };
154 
155     static_assert(C().a == 1, "");
156     static_assert(C().b == 2, ""); // expected-error {{constant}} expected-note {{read of}}
157     static_assert(C().d == 4, ""); // expected-error {{constant}} expected-note {{read of}}
158     static_assert(C().e == 5, "");
159 
160     static_assert(C('x').b == 2, ""); // expected-error {{constant}} expected-note {{read of}}
161     static_assert(C('x').c == 3, "");
162     static_assert(C('x').d == 4, ""); // expected-error {{constant}} expected-note {{read of}}
163     static_assert(C('x').e == 5, "");
164 
165     static_assert(C(1).b == 2, "");
166     static_assert(C(1).c == 3, ""); // expected-error {{constant}} expected-note {{read of}}
167     static_assert(C(1).d == 4, "");
168     static_assert(C(1).e == 5, ""); // expected-error {{constant}} expected-note {{read of}}
169 
170     static_assert(C(1.f).b == 2, "");
171     static_assert(C(1.f).c == 3, ""); // expected-error {{constant}} expected-note {{read of}}
172     static_assert(C(1.f).e == 5, ""); // expected-error {{constant}} expected-note {{read of}}
173     static_assert(C(1.f).f == 6, "");
174 
175     static_assert(C("").a == 1, ""); // expected-error {{constant}} expected-note {{read of}}
176     static_assert(C("").b == 2, "");
177     static_assert(C("").c == 3, ""); // expected-error {{constant}} expected-note {{read of}}
178     static_assert(C("").d == 4, ""); // expected-error {{constant}} expected-note {{read of}}
179     static_assert(C("").e == 5, "");
180     static_assert(C("").f == 6, ""); // expected-error {{constant}} expected-note {{read of}}
181 
182     struct D;
183     extern const D d;
184     struct D {
185       int a;
186       union {
187         int b = const_cast<D&>(d).a = 1; // not evaluated
188         int c;
189       };
Ddr1460::Overriding::D190       constexpr D() : a(0), c(0) {}
191     };
192     constexpr D d {};
193     static_assert(d.a == 0, "");
194   }
195 #endif
196 }
197