blob: 0bfddf0bbb83deb65ad418eaf63c969873b18308 [file] [log] [blame]
// PR c++/91363 - P0960R3: Parenthesized initialization of aggregates.
// { dg-do run { target c++20 } }
// Test T[]().
int i;
int a1[](1, 2, 3);
static_assert(sizeof(a1) == 3 * sizeof (int), "");
int a2[](1.0, 2, 3);
static_assert(sizeof(a2) == 3 * sizeof (int), "");
int a3[3](1, 2, 3);
int a4[3](1, 2); // a4[2] is value-initialized.
int a5[](++i, ++i);
static_assert(sizeof(a5) == 2 * sizeof (int), "");
int a6[](1);
static_assert(sizeof(a6) == sizeof (int), "");
int a7[]({});
static_assert(sizeof(a7) == sizeof (int), "");
int a8[]({}, {}, {}, {}, {}, {});
static_assert(sizeof(a8) == 6 * sizeof (int), "");
int a9[]((1));
static_assert(sizeof(a9) == sizeof (int), "");
int a10[]((1), (2), (3));
static_assert(sizeof(a10) == 3 * sizeof (int), "");
int a11[][2]{1};
static_assert(sizeof(a11) == 2 * sizeof (int), "");
int a12[][2]({1, 2}, {3, 4});
static_assert(sizeof(a12) == 4 * sizeof (int), "");
const int (&ra1)[](1, 2);
const int (&ra2)[](1.0, 2);
const int (&ra3)[2](1.0, 2);
int (&&rra1)[](1, 2);
int (&&rra2)[](1.0, 2);
int (&&rra3)[2](1.0, 2);
struct S { int i; } s;
S s1[]({1});
static_assert(sizeof(s1) == sizeof (S), "");
S s2[]({1}, {2});
static_assert(sizeof(s2) == 2 * sizeof (S), "");
S s3[]({1}, {2}, {3});
static_assert(sizeof(s3) == 3 * sizeof (S), "");
S s4[3]({1}, {2});
static_assert(sizeof(s4) == 3 * sizeof (S), "");
S s5[]({++i}, {++i});
static_assert(sizeof(s2) == 2 * sizeof (S), "");
S s6[](s, s);
struct R { int i; int j; };
R r1[]({1, 2});
static_assert(sizeof(r1) == sizeof (R), "");
R r2[]({1, 2}, {3, 4});
static_assert(sizeof(r2) == 2 * sizeof (R), "");
R r3[]({1.0, 2}, {3.2, 4});
static_assert(sizeof(r3) == 2 * sizeof (R), "");
char c1[]('r');
char c2[]('r', 'a', 'c', 'c', 'o', 'o', 'n');
char c3[]("yarrow");
char c4[4]("oak");
char c5[10]("cat");
const char (&c6)[4]("eel");
int g;
struct X {
int i;
X() { ++g; }
X(int) { };
};
int
main ()
{
// Here we'll value-initialize l[1] and l[2], which will zero-initialize it.
int l[3](42);
if (l[0] != 42 || l[1] != 0 || l[2] != 0)
__builtin_abort ();
// Here we'll value-initialize x[2] and x[3]. Since X is a class type
// with a user-provided ctor, we'll default-initialize in both cases.
X x[4]({ 1 }, { 2 });
if (g != 2)
__builtin_abort ();
if (a1[0] != 1 || a1[1] != 2 || a1[2] != 3)
__builtin_abort ();
if (a2[0] != 1 || a2[1] != 2 || a2[2] != 3)
__builtin_abort ();
if (a3[0] != 1 || a3[1] != 2 || a3[2] != 3)
__builtin_abort ();
if (a4[0] != 1 || a4[1] != 2 || a4[2] != 0)
__builtin_abort ();
if (a5[0] != 1 || a5[1] != 2)
__builtin_abort ();
if (a6[0] != 1)
__builtin_abort ();
if (a7[0] != 0)
__builtin_abort ();
if (a8[0] != 0 || a8[1] != 0 || a8[2] != 0 || a8[3] != 0
|| a8[4] != 0 || a8[5] != 0)
__builtin_abort ();
if (a9[0] != 1)
__builtin_abort ();
if (a10[0] != 1 || a10[1] != 2 || a10[2] != 3)
__builtin_abort ();
if (a11[0][0] != 1 || a11[0][1] != 0)
__builtin_abort ();
if (a12[0][0] != 1 || a12[0][1] != 2 || a12[1][0] != 3 || a12[1][1] != 4)
__builtin_abort ();
if (ra1[0] != 1 || ra1[1] != 2)
__builtin_abort ();
if (ra2[0] != 1 || ra2[1] != 2)
__builtin_abort ();
if (ra3[0] != 1 || ra3[1] != 2)
__builtin_abort ();
if (rra1[0] != 1 || rra1[1] != 2)
__builtin_abort ();
if (rra2[0] != 1 || rra2[1] != 2)
__builtin_abort ();
if (rra3[0] != 1 || rra3[1] != 2)
__builtin_abort ();
if (s1[0].i != 1)
__builtin_abort ();
if (s2[0].i != 1 || s2[1].i != 2)
__builtin_abort ();
if (s3[0].i != 1 || s3[1].i != 2 || s3[2].i != 3)
__builtin_abort ();
if (s4[0].i != 1 || s4[1].i != 2 || s4[2].i != 0)
__builtin_abort ();
if (s5[0].i != 3 || s5[1].i != 4)
__builtin_abort ();
if (r1[0].i != 1 || r1[0].j != 2)
__builtin_abort ();
if (r2[0].i != 1 || r2[0].j != 2 || r2[1].i != 3 || r2[1].j != 4)
__builtin_abort ();
if (r3[0].i != 1 || r3[0].j != 2 || r3[1].i != 3 || r3[1].j != 4)
__builtin_abort ();
}