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