cgraph: A COMDAT decl always has non-zero address.
[gcc.git] / gcc / testsuite / c-c++-common / array-1.c
1 // PR c++/90947 - Simple lookup table of array of strings is miscompiled
2 // { dg-do compile }
3 // { dg-options "-O1 -fdump-tree-optimized" }
4
5 #define assert(expr) ((expr) ? (void)0 : __builtin_abort ())
6
7 void pr90947 (void)
8 {
9 int vecsize = 4;
10 int index = 0;
11 static const char *a[4][4] =
12 {
13 { ".x", ".y", ".z", ".w" },
14 { ".xy", ".yz", ".zw", 0 },
15 { ".xyz", ".yzw", 0, 0 },
16 { "", 0, 0, 0 },
17 };
18
19 assert (vecsize >= 1 && vecsize <= 4);
20 assert (index >= 0 && index < 4);
21 assert (a[vecsize - 1][index]);
22 }
23
24 void f_a1_1 (void)
25 {
26 {
27 const char* a[1][1] = { { 0 } };
28 assert (0 == a[0][0]);
29 }
30 {
31 const char* a[1][1] = { { "" } };
32 assert ('\0' == *a[0][0]);
33 }
34 }
35
36 void f_a2_1 (void)
37 {
38 {
39 const char* a[2][1] = { { "" }, { "" } };
40 assert ('\0' == *a[0][0] && '\0' == *a[1][0]);
41 }
42 {
43 const char* a[2][1] = { { 0 }, { "" } };
44 assert (0 == a[0][0] && '\0' == *a[1][0]);
45 }
46 {
47 const char* a[2][1] = { { }, { "" } };
48 assert (0 == a[0][0] && '\0' == *a[1][0]);
49 }
50 }
51
52 void f_a2_2 (void)
53 {
54 {
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]);
58 }
59 {
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]);
63 }
64 {
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]);
68 }
69 {
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]);
73 }
74 {
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]);
78 }
79 {
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]);
83 }
84 {
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]);
88 }
89 {
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]);
93 }
94 }
95
96 void f_a2_2_2 (void)
97 {
98 {
99 const char* a[2][2][2] =
100 { { { "", "" }, { "", "" } }, { { "", "" }, { "", "" } } };
101
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]);
106 }
107
108 {
109 const char* a[2][2][2] =
110 { { { "", "" }, { "", "" } }, { { "", "" }, { 0, "" } } };
111
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]);
116 }
117
118 {
119 const char* a[2][2][2] =
120 { { { "", "" }, { "", "" } }, { { 0, 0 }, { 0, "" } } };
121
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]);
126 }
127
128 {
129 const char* a[2][2][2] =
130 { { { "", "" }, { 0, 0 } }, { { 0, 0 }, { 0, "" } } };
131
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]);
136 }
137
138 {
139 const char* a[2][2][2] =
140 { { { 0, 0 }, { 0, 0 } }, { { 0, 0 }, { 0, "" } } };
141
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]);
146 }
147
148 {
149 const char* a[2][2][2] =
150 { { { }, { } }, { { }, { 0, "" } } };
151
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]);
156 }
157 }
158
159 void f_sa2_2_2 (void)
160 {
161 struct S { const char a[2], *s, c; };
162
163 {
164 const struct S a[2][2][2] = {
165 { },
166 {
167 { { }, { "", "" } },
168 { }
169 }
170 };
171
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);
176
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);
181 }
182
183 {
184 const struct S a[2][2][2] = {
185 { },
186 {
187 { { } },
188 { { "", "" } }
189 }
190 };
191
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);
196
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);
201 }
202
203 {
204 const struct S a[2][2][2] = {
205 { },
206 {
207 { { }, { } },
208 { { }, { "", "", 0 } }
209 }
210 };
211
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);
216
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);
221 }
222
223 {
224 const struct S a[2][2][2] = {
225 {
226 { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
227 { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
228 },
229 {
230 { { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
231 { { }, { "", "", 0 } }
232 }
233 };
234
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);
239
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);
244 }
245 }
246
247 // { dg-final { scan-tree-dump-not "abort" "optimized" } }