1 /* PR middle-end/91458 - inconsistent warning for writing past the end
3 See Wstringop-overflow-3.C for the same test that exercises the other
6 { dg-options "-O2 -Wall -Wno-stringop-overflow" } */
10 // Exercise flexible array members.
15 char a[]; // { dg-message "while referencing .Ax::a." "pr91463" { xfail *-*-* } }
18 // Verify warning for a definition with no initializer.
23 ax_.a[0] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
24 ax_.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
25 ax_.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
28 // Verify warning for access to a definition with an initializer that doesn't
29 // initialize the flexible array member.
34 ax0.a[0] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
35 ax0.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
36 ax0.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
39 // Verify warning for access to a definition with an initializer that
40 // initializes the flexible array member to empty.
45 ax0_.a[0] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
46 ax0_.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
47 ax0_.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
50 // Verify warning for out-of-bounds accesses to a definition with
52 Ax ax1 = { 1, { 0 } };
57 ax1.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
58 ax1.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
61 Ax ax2 = { 2, { 1, 0 } };
67 ax2.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
71 // Verify no warning for an unknown struct object.
80 // Verify no warning for an extern struct object whose array may be
81 // initialized to any number of elements.
91 // Exercise zero-length array members.
96 char a[0]; // { dg-message "while referencing .A0::a." }
99 // Verify warning for a definition with no initializer.
104 a0_.a[0] = 0; // { dg-warning "\\\[-Warray-bounds" }
105 a0_.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
106 a0_.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
109 // Verify warning for access to a definition with an initializer that doesn't
110 // initialize the flexible array member.
115 a00.a[0] = 0; // { dg-warning "\\\[-Warray-bounds" }
116 a00.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
117 a00.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
120 // Verify warning for access to a definition with an initializer that
121 // initializes the flexible array member to empty.
122 A0 a00_ = { 0, { } };
126 a00_.a[0] = 0; // { dg-warning "\\\[-Warray-bounds" }
127 a00_.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
128 a00_.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
131 // The following are rejected with
132 // error: too many initializers for 'char [0]'
133 // A0 a01 = { 1, { 0 } };
134 // A0 a02 = { 2, { 1, 0 } };
137 // Verify no warning for an unknown struct object.
146 // Verify warning for an extern struct object which (unlike a true
147 // flexible array member) may not be initialized.
152 a0x.a[0] = 0; // { dg-warning "\\\[-Warray-bounds" }
153 a0x.a[3] = 0; // { dg-warning "\\\[-Warray-bounds" }
154 a0x.a[9] = 0; // { dg-warning "\\\[-Warray-bounds" }
158 // Exercise trailing one-element array members.
163 char a[1]; // { dg-message "while referencing .A1::a." }
166 // Verify warning for a definition with no initializer.
172 a1_.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
173 a1_.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
176 // Verify warning for access to a definition with an initializer that doesn't
177 // initialize the one-element array member.
183 a1__.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
184 a1__.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
187 // Verify warning for access to a definition with an initializer that
188 // initializes the one-element array member to empty.
189 A1 a1_0 = { 0, { } };
194 a1_0.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
195 a1_0.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
198 // Verify warning for access to a definition with an initializer that
199 // initializes the one-element array member.
200 A1 a1_1 = { 0, { 1 } };
205 a1_1.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
206 a1_1.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
210 // Verify no warning for an unknown struct object.
219 // Verify warning for an extern struct object. Similar to the zero-length
220 // array case, a one-element trailing array can be initialized to at most
227 a1x.a[3] = 0; // { dg-warning "\\\[-Warray-bounds" }
228 a1x.a[9] = 0; // { dg-warning "\\\[-Warray-bounds" }
231 // Exercise interior one-element array members (verify they're not
232 // treated as trailing.
237 char a[1]; // { dg-message "while referencing .A1i::a." }
241 // Verify warning for a definition with no initializer.
247 a1i_.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
248 a1i_.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
251 // Verify warning for access to a definition with an initializer that doesn't
252 // initialize the one-element array member.
258 a1i__.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
259 a1i__.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
262 // Verify warning for access to a definition with an initializer that
263 // initializes the one-element array member to empty.
264 A1 a1i_0 = { 0, { } };
269 a1i_0.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
270 a1i_0.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
273 // Verify warning for access to a definition with an initializer that
274 // initializes the one-element array member.
275 A1 a1i_1 = { 0, { 1 } };
280 a1i_1.a[1] = 0; // { dg-warning "\\\[-Warray-bounds" }
281 a1i_1.a[2] = 0; // { dg-warning "\\\[-Warray-bounds" }
285 // Verify no warning for an unknown struct object.
289 p->a[3] = 0; // { dg-warning "\\\[-Warray-bounds" }
290 p->a[9] = 0; // { dg-warning "\\\[-Warray-bounds" }
294 // Verify no warning for an extern struct object.
300 a1ix.a[3] = 0; // { dg-warning "\\\[-Warray-bounds" }
301 a1ix.a[9] = 0; // { dg-warning "\\\[-Warray-bounds" }
305 // Verify non-POD classes with flexible array members.
310 char a[]; // { dg-message "while referencing .Bx::a." "pr91463" { xfail *-*-* } }
312 // Verify the warning for a constant.
313 Bx () { a[0] = 0; } // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
315 // And also for a non-constant. Regardless of the subscript, the array
316 // of the object in function gxi() below has a zero size.
317 Bx (int i) { a[i] = 0; } // { dg-warning "\\\[-Warray-bounds" "pr91463" { xfail *-*-* } }
335 char a[0]; // { dg-message "while referencing .B0::a." }
337 B0 () { a[0] = 0; } // { dg-warning "\\\[-Warray-bounds" }
351 char a[1]; // { dg-message "while referencing .B1::a." }
353 B1 () { a[1] = 0; } // { dg-warning "\\\[-Warray-bounds" }
365 char a[123]; // { dg-message "while referencing .B123::a." }
367 B123 () { a[123] = 0; } // { dg-warning "\\\[-Warray-bounds" }
379 char a[234]; // { dg-message "while referencing .B234::a." }
381 B234 (int i) { a[i] = 0; } // { dg-warning "\\\[-Warray-bounds" }
386 struct B234 b234 (234);