1 // PR c++/90947 - Simple lookup table of array of strings is miscompiled
3 // { dg-options "-O1 -fdump-tree-optimized" }
5 #define assert(expr) ((expr) ? (void)0 : __builtin_abort ())
11 static const char *a
[4][4] =
13 { ".x", ".y", ".z", ".w" },
14 { ".xy", ".yz", ".zw", 0 },
15 { ".xyz", ".yzw", 0, 0 },
19 assert (vecsize
>= 1 && vecsize
<= 4);
20 assert (index
>= 0 && index
< 4);
21 assert (a
[vecsize
- 1][index
]);
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]);
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]);
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]);
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] = {
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] = {
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] = {
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" } }