2 // Test to verify that constant array elements initialized to zero
3 // evaluate to zero regardless of the form of their initilizer,
4 // and irrespective whether it's explicit or implicit.
6 // { dg-do compile { target c++11 } }
7 // { dg-options "-Wall" }
9 static const char all_zero[1024] = { };
13 constexpr int a[][3] = { { 0, 0 }, { 0 }, { } };
15 static_assert (sizeof a == sizeof (int) * 3 * 3);
17 static_assert ( a[0][0] == 0 && a[0][1] == 0 && a[0][2] == 0
18 && a[1][0] == 0 && a[1][1] == 0 && a[1][2] == 0
19 && a[2][0] == 0 && a[2][1] == 0 && a[2][2] == 0);
21 constexpr int b[3][3] = { { 0, 0 }, { 0 } };
23 static_assert (sizeof b == sizeof (int) * 3 * 3);
25 static_assert ( b[0][0] == 0 && b[0][1] == 0 && b[0][2] == 0
26 && b[1][0] == 0 && b[1][1] == 0 && b[1][2] == 0
27 && b[2][0] == 0 && b[2][1] == 0 && b[2][2] == 0);
29 constexpr int c[3][3] = { { } };
31 static_assert (sizeof c == sizeof (int) * 3 * 3);
33 static_assert ( c[0][0] == 0 && c[0][1] == 0 && c[0][2] == 0
34 && c[1][0] == 0 && c[1][1] == 0 && c[1][2] == 0
35 && c[2][0] == 0 && c[2][1] == 0 && c[2][2] == 0);
41 constexpr char a[][3] = { { 0, 0 }, { 0 }, { } };
43 static_assert (sizeof a == sizeof (char) * 3 * 3);
45 static_assert ( a[0][0] == 0 && a[0][1] == 0 && a[0][2] == 0
46 && a[1][0] == 0 && a[1][1] == 0 && a[1][2] == 0
47 && a[2][0] == 0 && a[2][1] == 0 && a[2][2] == 0);
49 constexpr char b[3][3] = { { 0, 0 }, { 0 } };
51 static_assert (sizeof b == sizeof (char) * 3 * 3);
53 static_assert ( b[0][0] == 0 && b[0][1] == 0 && b[0][2] == 0
54 && b[1][0] == 0 && b[1][1] == 0 && b[1][2] == 0
55 && b[2][0] == 0 && b[2][1] == 0 && b[2][2] == 0);
57 constexpr char c[3][3] = { { } };
59 static_assert (sizeof c == sizeof (char) * 3 * 3);
61 static_assert ( c[0][0] == 0 && c[0][1] == 0 && c[0][2] == 0
62 && c[1][0] == 0 && c[1][1] == 0 && c[1][2] == 0
63 && c[2][0] == 0 && c[2][1] == 0 && c[2][2] == 0);
68 constexpr char a[][3] = { "\0", "", { } };
70 static_assert (sizeof a == sizeof (char) * 3 * 3);
72 static_assert ( a[0][0] == 0 && a[0][1] == 0 && a[0][2] == 0
73 && a[1][0] == 0 && a[1][1] == 0 && a[1][2] == 0
74 && a[2][0] == 0 && a[2][1] == 0 && a[2][2] == 0);
76 constexpr char b[3][3] = { "\0", "" };
78 static_assert (sizeof b == sizeof (char) * 3 * 3);
80 static_assert ( b[0][0] == 0 && b[0][1] == 0 && b[0][2] == 0
81 && b[1][0] == 0 && b[1][1] == 0 && b[1][2] == 0
82 && b[2][0] == 0 && b[2][1] == 0 && b[2][2] == 0);
84 constexpr char c[3][3] = { };
86 static_assert (sizeof c == sizeof (char) * 3 * 3);
88 static_assert ( c[0][0] == 0 && c[0][1] == 0 && c[0][2] == 0
89 && c[1][0] == 0 && c[1][1] == 0 && c[1][2] == 0
90 && c[2][0] == 0 && c[2][1] == 0 && c[2][2] == 0);
93 namespace test_string_member
95 struct B { struct A { char a[5]; } a[2]; };
103 /* a[0] */ { { 0, 0, 0, 0, 0 } },
104 /* a[1] */ { { 0, 0 } }
111 /* a[0] */ { "\0\0\0\0" },
117 static_assert ( b[0].a[0].a[0] == 0
118 && b[0].a[0].a[1] == 0
119 && b[0].a[0].a[2] == 0
120 && b[0].a[0].a[3] == 0
121 && b[0].a[0].a[4] == 0
122 && b[0].a[1].a[0] == 0
123 && b[0].a[1].a[1] == 0
124 && b[0].a[1].a[2] == 0
125 && b[0].a[1].a[3] == 0
126 && b[0].a[1].a[4] == 0
127 && b[1].a[0].a[0] == 0
128 && b[1].a[0].a[1] == 0
129 && b[1].a[0].a[2] == 0
130 && b[1].a[0].a[3] == 0
131 && b[1].a[0].a[4] == 0
132 && b[2].a[0].a[0] == 0
133 && b[2].a[0].a[1] == 0
134 && b[2].a[0].a[2] == 0
135 && b[2].a[0].a[3] == 0
136 && b[2].a[0].a[4] == 0);