1 // PR c++/91363 - P0960R3: Parenthesized initialization of aggregates.
2 // { dg-do run { target c++2a } }
3
4 struct A {
5 int i;
6 int j;
7 int k;
8 };
9
10 struct B {
11 int i;
12 int j;
13 int k = 42;
14 };
15
16 struct C {
17 A a;
18 };
19
20 struct D {
21 A a1;
22 A a2;
23 };
24
25 struct E {
26 int i;
27 };
28
29 // F has a base class, but it's not virtual, private, or protected, so this is
30 // still an aggregate (since C++17).
31 struct F : E {
32 int j;
33 int k;
34 };
35
36 F f({1}, 2, 3);
37
38 // A non-virtual member function doesn't make it a non-aggregate.
39 struct G {
40 int i;
41 double j;
42 int foo(int, int);
43 };
44
45 G g(1, 2.14);
46
47 class H {
48 public:
H(int)49 H (int) { }
50 };
51
52 class I : public H { };
53
54 int i;
55 A a1(1, 2);
56 A a2(1.0, 2);
57 A a3(++i, ++i);
58 const A& ra(1, 2);
59
60 A ca = A(1, 2);
61 A ca2 = A(1.0, 2);
62 A ca3 = A(++i, ++i);
63 const A& rca = A(1, 2);
64
65 B b1(1, 2, 3);
66 B b2(1, 2);
67 B b3(1);
68
69 C c1({5, 6, 7});
70 D d1({1, 2, 3}, {5, 6, 7});
71
72 struct W {
73 const char *s, *t;
74 };
75 W w1("fluffer", "nutter");
76
77 struct Y {
78 char a[4];
79 };
80 Y y("yew");
81
82 int
main()83 main ()
84 {
85 I(10);
86
87 // A::k will be value-initialized.
88 if (a1.i != 1 || a1.j != 2 || a1.k != 0)
89 __builtin_abort ();
90 if (a2.i != 1 || a2.j != 2 || a2.k != 0)
91 __builtin_abort ();
92 if (a3.i != 1 || a3.j != 2 || a3.k != 0)
93 __builtin_abort ();
94 if (ra.i != 1 || ra.j != 2 || ra.k != 0)
95 __builtin_abort ();
96 if (ca.i != 1 || ca.j != 2 || ca.k != 0)
97 __builtin_abort ();
98 if (ca2.i != 1 || ca2.j != 2 || ca2.k != 0)
99 __builtin_abort ();
100 if (ca3.i != 3 || ca3.j != 4 || ca3.k != 0)
101 __builtin_abort ();
102
103 if (b1.i != 1 || b1.j != 2 || b1.k != 3)
104 __builtin_abort ();
105 // The default member initializer will be used for B::k.
106 if (b2.i != 1 || b2.j != 2 || b2.k != 42)
107 __builtin_abort ();
108 if (b3.i != 1 || b3.j != 0 || b3.k != 42)
109 __builtin_abort ();
110
111 if (c1.a.i != 5 || c1.a.j != 6 || c1.a.k != 7)
112 __builtin_abort ();
113
114 if (f.i != 1 || f.j != 2 || f.k != 3)
115 __builtin_abort ();
116 }
117