1// RUN: %clang_cc1 -std=c++1y %s -verify
2
3namespace 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;
33    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
49namespace nested_aggregate_init {
50  struct A {
51    int n = 5;
52    int b = n * 3;
53  };
54  struct B {
55    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.
58    constexpr int f() const { return A{k}.b; }
59    double d;
60    int k;
61  };
62  static_assert(B(6).f() == 18, "");
63}
64