// PR c++/92812 // { dg-do run { target c++20 } } // { dg-options "-Wall -Wextra" } // Initializing arrays in a member init list using ()-init, valid cases. #define assert(X) do { if (!(X)) __builtin_abort(); } while(0) struct S { int x, y; }; struct N { int x, y; N(int, int); }; static S s{10, 11}; struct A { S s1; S s2; S a1[2]; S a2[2]; S a3[2]; S a4[2]; S a5[2]; S a6[2]; A() : s1(1, 2), s2(1), // { dg-warning "missing initializer for member" } a1({1}), // { dg-warning "missing initializer for member" } a2({1, 2}), a3({}, {}), a4(), a5(s), a6(s, s) { } }; struct C { int a1[2]; int a2[2]; int a3[2]; int a4[2]; int a5[2]; C() : a1(1), a2(1, 2), a3({1}), a4({}, {}), a5() { } }; struct D { N n; // Not an aggregate, should work pre-C++20 too. D() : n(1, 2) { } }; struct E { char a1[4]; char a2[4]; E() : a1("ab"), a2("abc") { } }; // Compound literal. struct F { F (); S m[1]; }; F::F () : m(__extension__(S[1]) { 1, 2 }) { } struct B { int i; }; struct Der : B { }; Der d; struct G { B b1[1]; B b2[2]; G(): b1(d), b2(d, d) { } }; // Variation of c++/93790. struct Empty { }; struct Empty_refwrap { Empty& r; Empty_refwrap(Empty &e) : r(e) { } operator Empty&() { return r; } }; Empty empty; Empty_refwrap empty_refwrap(empty); struct H { Empty &e; // Turning this into {empty_refwrap} would break things. H() : e(empty_refwrap) { } }; int main () { A a; assert (a.s1.x == 1 && a.s1.y == 2); assert (a.s2.x == 1 && a.s2.y == 0); assert (a.a1[0].x == 1 && a.a1[0].y == 0 && a.a1[1].x == 0 && a.a1[1].y == 0); assert (a.a2[0].x == 1 && a.a2[0].y == 2 && a.a2[1].x == 0 && a.a2[1].y == 0); assert (a.a3[0].x == 0 && a.a3[0].y == 0 && a.a3[1].x == 0 && a.a3[1].y == 0); assert (a.a4[0].x == 0 && a.a4[0].y == 0 && a.a4[1].x == 0 && a.a4[1].y == 0); assert (a.a5[0].x == 10 && a.a5[0].y == 11 && a.a5[1].x == 0 && a.a5[1].y == 0); assert (a.a6[0].x == 10 && a.a6[0].y == 11 && a.a6[1].x == 10 && a.a6[1].y == 11); C c; assert (c.a1[0] == 1 && c.a1[1] == 0); assert (c.a2[0] == 1 && c.a2[1] == 2); assert (c.a3[0] == 1 && c.a3[1] == 0); assert (c.a4[0] == 0 && c.a4[1] == 0); assert (c.a5[0] == 0 && c.a5[1] == 0); E e; assert (__builtin_strcmp (e.a1, "ab") == 0 && __builtin_strcmp (e.a2, "abc") == 0); }