1 // RUN: %clang_cc1 -std=c++1y %s -verify 2 3 namespace in_class_init { 4 union U { char c; double d = 4.0; }; 5 constexpr U u1 = U(); 6 constexpr U u2 {}; 7 constexpr U u3 { 'x' }; 8 static_assert(u1.d == 4.0, ""); 9 static_assert(u2.d == 4.0, ""); 10 static_assert(u3.c == 'x', ""); 11 12 struct A { 13 int n = 5; 14 int m = n * 3; 15 union { 16 char c; 17 double d = 4.0; 18 }; 19 }; 20 constexpr A a1 {}; 21 constexpr A a2 { 8 }; 22 constexpr A a3 { 1, 2, { 3 } }; 23 constexpr A a4 { 1, 2, { .d = 3.0 } }; 24 static_assert(a1.d == 4.0, ""); 25 static_assert(a2.m == 24, ""); 26 static_assert(a2.d == 4.0, ""); 27 static_assert(a3.c == 3, ""); 28 static_assert(a3.d == 4.0, ""); // expected-error {{constant expression}} expected-note {{active member 'c'}} 29 static_assert(a4.d == 3.0, ""); 30 31 struct B { 32 int n; fin_class_init::B33 constexpr int f() { return n * 5; } 34 int m = f(); 35 }; 36 B b1 {}; 37 constexpr B b2 { 2 }; 38 B b3 { 1, 2 }; 39 static_assert(b2.m == 10, ""); 40 41 struct C { 42 int k; 43 union { 44 int l = k; // expected-error {{invalid use of non-static}} 45 }; 46 }; 47 } 48 49 namespace nested_aggregate_init { 50 struct A { 51 int n = 5; 52 int b = n * 3; 53 }; 54 struct B { Bnested_aggregate_init::B55 constexpr B(int k) : d(1.23), k(k) {} 56 // Within this aggregate, both this object's 'this' and the temporary's 57 // 'this' are used. fnested_aggregate_init::B58 constexpr int f() const { return A{k}.b; } 59 double d; 60 int k; 61 }; 62 static_assert(B(6).f() == 18, ""); 63 } 64