c++: prvalue of array type [PR111286]
[official-gcc.git] / gcc / testsuite / c-c++-common / array-1.c
blob5de9ade4d4339efdbd1c7d2921a8bf67f0f81701
1 // PR c++/90947 - Simple lookup table of array of strings is miscompiled
2 // { dg-do compile }
3 // { dg-options "-O1 -fdump-tree-optimized" }
5 #define assert(expr) ((expr) ? (void)0 : __builtin_abort ())
7 void pr90947 (void)
9 int vecsize = 4;
10 int index = 0;
11 static const char *a[4][4] =
13 { ".x", ".y", ".z", ".w" },
14 { ".xy", ".yz", ".zw", 0 },
15 { ".xyz", ".yzw", 0, 0 },
16 { "", 0, 0, 0 },
19 assert (vecsize >= 1 && vecsize <= 4);
20 assert (index >= 0 && index < 4);
21 assert (a[vecsize - 1][index]);
24 void f_a1_1 (void)
27 const char* a[1][1] = { { 0 } };
28 assert (0 == a[0][0]);
31 const char* a[1][1] = { { "" } };
32 assert ('\0' == *a[0][0]);
36 void f_a2_1 (void)
39 const char* a[2][1] = { { "" }, { "" } };
40 assert ('\0' == *a[0][0] && '\0' == *a[1][0]);
43 const char* a[2][1] = { { 0 }, { "" } };
44 assert (0 == a[0][0] && '\0' == *a[1][0]);
47 const char* a[2][1] = { { }, { "" } };
48 assert (0 == a[0][0] && '\0' == *a[1][0]);
52 void f_a2_2 (void)
55 const char* a[2][2] = { { "", "" }, { "", "" } };
56 assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
57 assert ('\0' == *a[1][0] && '\0' == *a[1][1]);
60 const char* a[2][2] = { { "", "" }, { "", 0 } };
61 assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
62 assert ('\0' == *a[1][0] && 0 == a[1][1]);
65 const char* a[2][2] = { { "", "" }, { "" } };
66 assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
67 assert ('\0' == *a[1][0] && 0 == a[1][1]);
70 const char* a[2][2] = { { "", "" }, { 0, "" } };
71 assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
72 assert (0 == a[1][0] && '\0' == *a[1][1]);
75 const char* a[2][2] = { { "", 0 }, { 0, "" } };
76 assert ('\0' == *a[0][0] && 0 == a[0][1]);
77 assert (0 == a[1][0] && '\0' == *a[1][1]);
80 const char* a[2][2] = { { 0, 0 }, { 0, "" } };
81 assert (0 == a[0][0] && 0 == a[0][1]);
82 assert (0 == a[1][0] && '\0' == *a[1][1]);
85 const char* a[2][2] = { { 0 }, { 0, "" } };
86 assert (0 == a[0][0] && 0 == a[0][1]);
87 assert (0 == a[1][0] && '\0' == *a[1][1]);
90 const char* a[2][2] = { { }, { 0, "" } };
91 assert (0 == a[0][0] && 0 == a[0][1]);
92 assert (0 == a[1][0] && '\0' == *a[1][1]);
96 void f_a2_2_2 (void)
99 const char* a[2][2][2] =
100 { { { "", "" }, { "", "" } }, { { "", "" }, { "", "" } } };
102 assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
103 assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
104 assert ('\0' == *a[1][0][0] && '\0' == *a[1][0][1]);
105 assert ('\0' == *a[1][1][0] && '\0' == *a[1][1][1]);
109 const char* a[2][2][2] =
110 { { { "", "" }, { "", "" } }, { { "", "" }, { 0, "" } } };
112 assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
113 assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
114 assert ('\0' == *a[1][0][0] && '\0' == *a[1][0][1]);
115 assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
119 const char* a[2][2][2] =
120 { { { "", "" }, { "", "" } }, { { 0, 0 }, { 0, "" } } };
122 assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
123 assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
124 assert (0 == a[1][0][0] && 0 == a[1][0][1]);
125 assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
129 const char* a[2][2][2] =
130 { { { "", "" }, { 0, 0 } }, { { 0, 0 }, { 0, "" } } };
132 assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
133 assert (0 == a[0][1][0] && 0 == a[0][1][1]);
134 assert (0 == a[1][0][0] && 0 == a[1][0][1]);
135 assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
139 const char* a[2][2][2] =
140 { { { 0, 0 }, { 0, 0 } }, { { 0, 0 }, { 0, "" } } };
142 assert (0 == a[0][0][0] && 0 == a[0][0][1]);
143 assert (0 == a[0][1][0] && 0 == a[0][1][1]);
144 assert (0 == a[1][0][0] && 0 == a[1][0][1]);
145 assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
149 const char* a[2][2][2] =
150 { { { }, { } }, { { }, { 0, "" } } };
152 assert (0 == a[0][0][0] && 0 == a[0][0][1]);
153 assert (0 == a[0][1][0] && 0 == a[0][1][1]);
154 assert (0 == a[1][0][0] && 0 == a[1][0][1]);
155 assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
159 void f_sa2_2_2 (void)
161 struct S { const char a[2], *s, c; };
164 const struct S a[2][2][2] = {
165 { },
167 { { }, { "", "" } },
172 assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s && 0 == a[0][0][0].c);
173 assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s && 0 == a[0][0][1].c);
174 assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s && 0 == a[0][1][0].c);
175 assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s && 0 == a[0][1][1].c);
177 assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s && 0 == a[1][0][0].c);
178 assert ('\0' == *a[1][0][1].a && '\0' == *a[1][0][1].s && 0 == a[1][0][1].c);
179 assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s && 0 == a[1][1][0].c);
180 assert ('\0' == *a[1][1][1].a && 0 == a[1][1][1].s && 0 == a[1][1][1].c);
184 const struct S a[2][2][2] = {
185 { },
187 { { } },
188 { { "", "" } }
192 assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
193 assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
194 assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
195 assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
197 assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
198 assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
199 assert ('\0' == *a[1][1][0].a && '\0' == *a[1][1][0].s);
200 assert ('\0' == *a[1][1][1].a && 0 == a[1][1][1].s);
204 const struct S a[2][2][2] = {
205 { },
207 { { }, { } },
208 { { }, { "", "", 0 } }
212 assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
213 assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
214 assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
215 assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
217 assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
218 assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
219 assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s);
220 assert ('\0' == *a[1][1][1].a && '\0' == *a[1][1][1].s);
224 const struct S a[2][2][2] = {
226 { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
227 { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
230 { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
231 { { }, { "", "", 0 } }
235 assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
236 assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
237 assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
238 assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
240 assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
241 assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
242 assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s);
243 assert ('\0' == *a[1][1][1].a && '\0' == *a[1][1][1].s);
247 // { dg-final { scan-tree-dump-not "abort" "optimized" } }