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++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 4 // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors 5 6 #if __cplusplus < 201103L 7 // expected-no-diagnostics 8 #endif 9 10 namespace dr1460 { // dr1460: 3.5 11 #if __cplusplus >= 201103L 12 namespace DRExample { 13 union A { 14 union {}; 15 union {}; 16 constexpr A() {} 17 }; 18 constexpr A a = A(); 19 20 union B { 21 union {}; 22 union {}; 23 constexpr B() = default; 24 }; 25 constexpr B b = B(); 26 27 union C { 28 union {}; 29 union {}; 30 }; 31 constexpr C c = C(); 32 #if __cplusplus > 201103L 33 constexpr void f() { C c; } 34 static_assert((f(), true), ""); 35 #endif 36 } 37 38 union A {}; 39 union B { int n; }; // expected-note +{{here}} 40 union C { int n = 0; }; 41 struct D { union {}; }; 42 struct E { union { int n; }; }; // expected-note +{{here}} 43 struct F { union { int n = 0; }; }; 44 45 struct X { 46 friend constexpr A::A() noexcept; 47 friend constexpr B::B() noexcept; // expected-error {{follows non-constexpr declaration}} 48 friend constexpr C::C() noexcept; 49 friend constexpr D::D() noexcept; 50 friend constexpr E::E() noexcept; // expected-error {{follows non-constexpr declaration}} 51 friend constexpr F::F() noexcept; 52 }; 53 54 // These are OK, because value-initialization doesn't actually invoke the 55 // constructor. 56 constexpr A a = A(); 57 constexpr B b = B(); 58 constexpr C c = C(); 59 constexpr D d = D(); 60 constexpr E e = E(); 61 constexpr F f = F(); 62 63 namespace Defaulted { 64 union A { constexpr A() = default; }; 65 union B { int n; constexpr B() = default; }; // expected-error {{not constexpr}} 66 union C { int n = 0; constexpr C() = default; }; 67 struct D { union {}; constexpr D() = default; }; 68 struct E { union { int n; }; constexpr E() = default; }; // expected-error {{not constexpr}} 69 struct F { union { int n = 0; }; constexpr F() = default; }; 70 71 struct G { union { int n = 0; }; union { int m; }; constexpr G() = default; }; // expected-error {{not constexpr}} 72 struct H { 73 union { 74 int n = 0; 75 }; 76 union { // expected-note 2{{member not initialized}} 77 int m; 78 }; 79 constexpr H() {} // expected-error {{must initialize all members}} 80 constexpr H(bool) : m(1) {} 81 constexpr H(char) : n(1) {} // expected-error {{must initialize all members}} 82 constexpr H(double) : m(1), n(1) {} 83 }; 84 } 85 86 #if __cplusplus > 201103L 87 template<typename T> constexpr bool check() { 88 T t; // expected-note-re 2{{non-constexpr constructor '{{[BE]}}'}} 89 return true; 90 } 91 static_assert(check<A>(), ""); 92 static_assert(check<B>(), ""); // expected-error {{constant}} expected-note {{in call}} 93 static_assert(check<C>(), ""); 94 static_assert(check<D>(), ""); 95 static_assert(check<E>(), ""); // expected-error {{constant}} expected-note {{in call}} 96 static_assert(check<F>(), ""); 97 #endif 98 99 union G { 100 int a = 0; // expected-note {{previous initialization is here}} 101 int b = 0; // expected-error {{initializing multiple members of union}} 102 }; 103 union H { 104 union { 105 int a = 0; // expected-note {{previous initialization is here}} 106 }; 107 union { 108 int b = 0; // expected-error {{initializing multiple members of union}} 109 }; 110 }; 111 struct I { 112 union { 113 int a = 0; // expected-note {{previous initialization is here}} 114 int b = 0; // expected-error {{initializing multiple members of union}} 115 }; 116 }; 117 struct J { 118 union { int a = 0; }; 119 union { int b = 0; }; 120 }; 121 122 namespace Overriding { 123 struct A { 124 int a = 1, b, c = 3; 125 constexpr A() : b(2) {} 126 }; 127 static_assert(A().a == 1 && A().b == 2 && A().c == 3, ""); 128 129 union B { 130 int a, b = 2, c; 131 constexpr B() : a(1) {} 132 constexpr B(char) : b(4) {} 133 constexpr B(int) : c(3) {} 134 constexpr B(const char*) {} 135 }; 136 static_assert(B().a == 1, ""); 137 static_assert(B().b == 2, ""); // expected-error {{constant}} expected-note {{read of}} 138 static_assert(B('x').a == 0, ""); // expected-error {{constant}} expected-note {{read of}} 139 static_assert(B('x').b == 4, ""); 140 static_assert(B(123).b == 2, ""); // expected-error {{constant}} expected-note {{read of}} 141 static_assert(B(123).c == 3, ""); 142 static_assert(B("").a == 1, ""); // expected-error {{constant}} expected-note {{read of}} 143 static_assert(B("").b == 2, ""); 144 static_assert(B("").c == 3, ""); // expected-error {{constant}} expected-note {{read of}} 145 146 struct C { 147 union { int a, b = 2, c; }; 148 union { int d, e = 5, f; }; 149 constexpr C() : a(1) {} 150 constexpr C(char) : c(3) {} 151 constexpr C(int) : d(4) {} 152 constexpr C(float) : f(6) {} 153 constexpr C(const char*) {} 154 }; 155 156 static_assert(C().a == 1, ""); 157 static_assert(C().b == 2, ""); // expected-error {{constant}} expected-note {{read of}} 158 static_assert(C().d == 4, ""); // expected-error {{constant}} expected-note {{read of}} 159 static_assert(C().e == 5, ""); 160 161 static_assert(C('x').b == 2, ""); // expected-error {{constant}} expected-note {{read of}} 162 static_assert(C('x').c == 3, ""); 163 static_assert(C('x').d == 4, ""); // expected-error {{constant}} expected-note {{read of}} 164 static_assert(C('x').e == 5, ""); 165 166 static_assert(C(1).b == 2, ""); 167 static_assert(C(1).c == 3, ""); // expected-error {{constant}} expected-note {{read of}} 168 static_assert(C(1).d == 4, ""); 169 static_assert(C(1).e == 5, ""); // expected-error {{constant}} expected-note {{read of}} 170 171 static_assert(C(1.f).b == 2, ""); 172 static_assert(C(1.f).c == 3, ""); // expected-error {{constant}} expected-note {{read of}} 173 static_assert(C(1.f).e == 5, ""); // expected-error {{constant}} expected-note {{read of}} 174 static_assert(C(1.f).f == 6, ""); 175 176 static_assert(C("").a == 1, ""); // expected-error {{constant}} expected-note {{read of}} 177 static_assert(C("").b == 2, ""); 178 static_assert(C("").c == 3, ""); // expected-error {{constant}} expected-note {{read of}} 179 static_assert(C("").d == 4, ""); // expected-error {{constant}} expected-note {{read of}} 180 static_assert(C("").e == 5, ""); 181 static_assert(C("").f == 6, ""); // expected-error {{constant}} expected-note {{read of}} 182 183 struct D; 184 extern const D d; 185 struct D { 186 int a; 187 union { 188 int b = const_cast<D&>(d).a = 1; // not evaluated 189 int c; 190 }; 191 constexpr D() : a(0), c(0) {} 192 }; 193 constexpr D d {}; 194 static_assert(d.a == 0, ""); 195 } 196 #endif 197 } 198 199 #if __cplusplus >= 201103L 200 namespace std { 201 typedef decltype(sizeof(int)) size_t; 202 203 // libc++'s implementation 204 template <class _E> 205 class initializer_list 206 { 207 const _E* __begin_; 208 size_t __size_; 209 210 initializer_list(const _E* __b, size_t __s) 211 : __begin_(__b), __size_(__s) {} 212 213 public: 214 typedef _E value_type; 215 typedef const _E& reference; 216 typedef const _E& const_reference; 217 typedef size_t size_type; 218 219 typedef const _E* iterator; 220 typedef const _E* const_iterator; 221 222 initializer_list() : __begin_(nullptr), __size_(0) {} 223 224 size_t size() const {return __size_;} 225 const _E* begin() const {return __begin_;} 226 const _E* end() const {return __begin_ + __size_;} 227 }; 228 } // std 229 230 namespace dr1467 { // dr1467: 3.7 c++11 231 // List-initialization of aggregate from same-type object 232 233 namespace basic0 { 234 struct S { 235 int i = 42; 236 }; 237 238 S a; 239 S b(a); 240 S c{a}; 241 242 struct SS : public S { } x; 243 S y(x); 244 S z{x}; 245 } // basic0 246 247 namespace basic1 { 248 struct S { 249 int i{42}; 250 }; 251 252 S a; 253 S b(a); 254 S c{a}; 255 256 struct SS : public S { } x; 257 S y(x); 258 S z{x}; 259 } // basic1 260 261 namespace basic2 { 262 struct S { 263 int i = {42}; 264 }; 265 266 S a; 267 S b(a); 268 S c{a}; 269 270 struct SS : public S { } x; 271 S y(x); 272 S z{x}; 273 } // basic2 274 275 namespace dr_example { 276 struct OK { 277 OK() = default; 278 OK(const OK&) = default; 279 OK(int) { } 280 }; 281 282 OK ok; 283 OK ok2{ok}; 284 285 struct X { 286 X() = default; 287 X(const X&) = default; 288 }; 289 290 X x; 291 X x2{x}; 292 } // dr_example 293 294 namespace nonaggregate { 295 struct NonAggregate { 296 NonAggregate() {} 297 }; 298 299 struct WantsIt { 300 WantsIt(NonAggregate); 301 }; 302 303 void f(NonAggregate); 304 void f(WantsIt); 305 306 void test1() { 307 NonAggregate n; 308 f({n}); 309 } 310 311 void test2() { 312 NonAggregate x; 313 NonAggregate y{x}; 314 NonAggregate z{{x}}; 315 } 316 } // nonaggregate 317 318 namespace SelfInitIsNotListInit { 319 struct S { 320 S(); 321 explicit S(S &); 322 S(const S &); 323 }; 324 S s1; 325 S s2 = {s1}; // ok, not list-initialization so we pick the non-explicit constructor 326 } 327 328 struct NestedInit { int a, b, c; }; 329 NestedInit ni[1] = {{NestedInit{1, 2, 3}}}; 330 331 namespace NestedInit2 { 332 struct Pair { int a, b; }; 333 struct TwoPairs { TwoPairs(Pair, Pair); }; 334 struct Value { Value(Pair); Value(TwoPairs); }; 335 void f() { Value{{{1,2},{3,4}}}; } 336 } 337 } // dr1467 338 339 namespace dr1490 { // dr1490: 3.7 c++11 340 // List-initialization from a string literal 341 342 char s[4]{"abc"}; // Ok 343 std::initializer_list<char>{"abc"}; // expected-error {{expected unqualified-id}}} 344 } // dr190 345 #endif 346