| /* PR middle-end/94940 - spurious -Warray-bounds for a zero length array |
| member of union |
| { dg-do compile } |
| { dg-options "-O2 -Wall" } */ |
| |
| extern int n; |
| |
| extern union Ua3_a0 { |
| int a3[3]; |
| int a2[2]; // can only alias a3[0 - 2] |
| int a1[1]; // can alias all of the union |
| int a0[0]; // ditto |
| } ua3_a0; |
| |
| void test_ua3_ua0_a0 (int i) |
| { |
| ua3_a0.a0[0] = 0; // { dg-bogus "\\\[-Warray-bounds" } |
| ua3_a0.a0[1] = 0; // { dg-bogus "\\\[-Warray-bounds" } |
| ua3_a0.a0[2] = 0; // { dg-bogus "\\\[-Warray-bounds" } |
| ua3_a0.a0[3] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| ua3_a0.a0[4] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| ua3_a0.a0[i] = 0; // { dg-bogus "\\\[-Warray-bounds" } |
| |
| if (i < __LINE__) |
| i = 5; |
| ua3_a0.a0[i] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| |
| if (i > -1) |
| i = -1; |
| ua3_a0.a0[i] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| void test_ua3_ua0_a1 (int i) |
| { |
| /* Abusing one-element array members the same way as those of |
| length zero is discouraged but so far acceted without warnings. |
| This should change at some point. */ |
| |
| ua3_a0.a1[0] = 0; |
| ua3_a0.a1[1] = 0; |
| ua3_a0.a1[2] = 0; |
| ua3_a0.a1[3] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| ua3_a0.a1[i] = 0; |
| |
| if (i > -1) |
| i = -1; |
| ua3_a0.a1[i] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| |
| if (i < 7) |
| i = 7; |
| ua3_a0.a1[i] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| void test_ua3_ua0_a2 (int i) |
| { |
| ua3_a0.a2[0] = 0; |
| ua3_a0.a2[1] = 0; |
| ua3_a0.a2[2] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| ua3_a0.a2[i] = 0; |
| |
| if (i < __LINE__) |
| i = __LINE__; |
| ua3_a0.a2[i] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| |
| if (i > -1) |
| i = -1; |
| ua3_a0.a2[i] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| |
| extern union Ua2_a3 { |
| int a2[2]; // can only alias a3[0 - 1] |
| int a3[3]; |
| } ua2_a3; |
| |
| void test_ua2_ua3 (int i) |
| { |
| ua2_a3.a2[0] = 0; // { dg-bogus "\\\[-Warray-bounds" } |
| ua2_a3.a2[1] = 0; // { dg-bogus "\\\[-Warray-bounds" } |
| ua2_a3.a2[2] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| ua2_a3.a2[i] = 0; |
| |
| if (i < __LINE__) |
| i = __LINE__; |
| ua2_a3.a2[i] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| |
| extern struct SUa2_a0 { |
| union Ua2_a0 { |
| int a2[2]; |
| int a0[0]; |
| } u; |
| } sua2_a0; |
| |
| void test_sua2_sua0 (int i) |
| { |
| n += sua2_a0.u.a0[0]; |
| n += sua2_a0.u.a0[1]; |
| n += sua2_a0.u.a0[2]; // { dg-warning "\\\[-Warray-bounds" } |
| n += sua2_a0.u.a0[i]; |
| |
| if (i < __LINE__) |
| i = __LINE__; |
| n += sua2_a0.u.a0[i]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| void test_sua2_sua0_ptr (int i) |
| { |
| union Ua2_a0 *p = &sua2_a0.u; |
| |
| n += p->a0[0]; |
| n += p->a0[1]; |
| n += p->a0[2]; // { dg-warning "\\\[-Warray-bounds" } |
| n += p->a0[i]; |
| } |
| |
| |
| extern struct SUSa3_a0 { |
| union USa3_a0 { |
| struct { |
| int a3[3]; |
| } s; |
| int a2[2]; // can alias s.a3[0 - 2] |
| int a1[1]; // can alias s.a3[0 - 2] |
| int a0[0]; // can alias s.a3[0] |
| } u; |
| } susa3_ua0; |
| |
| void test_susa3_sua0 (int i, int j) |
| { |
| n += susa3_ua0.u.a0[0]; |
| n += susa3_ua0.u.a0[1]; |
| n += susa3_ua0.u.a0[2]; |
| n += susa3_ua0.u.a0[3]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| void test_susa3_sua0_ptr (int i, int j) |
| { |
| union USa3_a0 *p = &susa3_ua0.u; |
| n += p->a0[0]; |
| n += p->a0[1]; |
| n += p->a0[2]; |
| n += p->a0[3]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| void test_susa3_sua1 (int i) |
| { |
| n += susa3_ua0.u.a1[0]; |
| n += susa3_ua0.u.a1[1]; |
| n += susa3_ua0.u.a1[2]; |
| n += susa3_ua0.u.a1[3]; // { dg-warning "\\\[-Warray-bounds" } |
| |
| if (i < __LINE__) |
| i = __LINE__; |
| n += susa3_ua0.u.a1[i]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| void test_susa3_sua2 (void) |
| { |
| n += susa3_ua0.u.a2[0]; |
| n += susa3_ua0.u.a2[1]; |
| n += susa3_ua0.u.a2[2]; // { dg-warning "\\\[-Warray-bounds" } |
| n += susa3_ua0.u.a2[3]; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| |
| extern struct { |
| union { |
| struct { |
| int a3[3]; |
| } s1; |
| struct { |
| int a0[0]; |
| } s2; |
| } u; |
| } susa3_usa0; |
| |
| void test_susi3_susi0 (int i) |
| { |
| n += susa3_usa0.u.s2.a0[0]; |
| n += susa3_usa0.u.s2.a0[1]; |
| n += susa3_usa0.u.s2.a0[2]; |
| n += susa3_usa0.u.s2.a0[3]; // { dg-warning "\\\[-Warray-bounds" } |
| n += susa3_usa0.u.s2.a0[i]; |
| |
| if (i < __LINE__) |
| i = __LINE__; |
| n += susa3_usa0.u.s2.a0[i]; // { dg-warning "\\\[-Warray-bounds" } |
| } |