1 // PR c++/89833
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.
5 
6 // { dg-do compile { target c++11 } }
7 // { dg-options "-Wall" }
8 
9 static const char all_zero[1024] = { };
10 
11 namespace test_int
12 {
13 constexpr int a[][3] = { { 0, 0 }, { 0 }, { } };
14 
15 static_assert (sizeof a == sizeof (int) * 3 * 3);
16 
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);
20 
21 constexpr int b[3][3] = { { 0, 0 }, { 0 } };
22 
23 static_assert (sizeof b == sizeof (int) * 3 * 3);
24 
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);
28 
29 constexpr int c[3][3] = { { } };
30 
31 static_assert (sizeof c == sizeof (int) * 3 * 3);
32 
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);
36 
37 }
38 
39 namespace test_char
40 {
41 constexpr char a[][3] = { { 0, 0 }, { 0 }, { } };
42 
43 static_assert (sizeof a == sizeof (char) * 3 * 3);
44 
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);
48 
49 constexpr char b[3][3] = { { 0, 0 }, { 0 } };
50 
51 static_assert (sizeof b == sizeof (char) * 3 * 3);
52 
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);
56 
57 constexpr char c[3][3] = { { } };
58 
59 static_assert (sizeof c == sizeof (char) * 3 * 3);
60 
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);
64 }
65 
66 namespace test_string
67 {
68 constexpr char a[][3] = { "\0", "", { } };
69 
70 static_assert (sizeof a == sizeof (char) * 3 * 3);
71 
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);
75 
76 constexpr char b[3][3] = { "\0", "" };
77 
78 static_assert (sizeof b == sizeof (char) * 3 * 3);
79 
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);
83 
84 constexpr char c[3][3] = { };
85 
86 static_assert (sizeof c == sizeof (char) * 3 * 3);
87 
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);
91 }
92 
93 namespace test_string_member
94 {
95 struct B { struct A { char a[5]; } a[2]; };
96 
97 constexpr B b[3] =
98   {
99    /* [0] */
100    {
101     /* a = */
102     {
103      /* a[0] */ { { 0, 0, 0, 0, 0 } },
104      /* a[1] */ { { 0, 0  } }
105     }
106    },
107    /* [1] */
108    {
109     /* a */
110     {
111      /* a[0] */ { "\0\0\0\0" },
112      /* a[0] */ { "" }
113     }
114    },
115   };
116 
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);
137 }
138