blob: 5b66cdc0aab1a475cf5c0dde281a204655b332c3 [file] [log] [blame]
/* 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" }
}