blob: c22a83a0dd7aade6bd17ad80954db89a21b69b31 [file] [log] [blame]
/* PR c/102103 - missing warning comparing array address to null
{ dg-do compile }
Verify -Waddress for member arrays of structs and notes.
{ dg-options "-Wall" } */
#if __cplusplus < 201103L
# define nullptr __null
#endif
void T (bool);
struct A
{
int n;
int ia[]; // { dg-message "'A::ia' declared here" }
};
struct B
{
A a[3]; // { dg-message "'B::a' declared here" }
};
struct C
{
B b[3]; // { dg-message "'C::b' declared here" }
};
struct D
{
C c[3]; // { dg-message "'D::c' declared here" }
};
void test_waddress_1d ()
{
D d[2]; // { dg-message "'d' declared here" }
T (d); // { dg-warning "address of 'd'" }
T (d == nullptr); // { dg-warning "address of 'd'" }
T (&d); // { dg-warning "address of 'd'" }
T (d->c); // { dg-warning "address of 'D::c'" }
T (d->c != nullptr); // { dg-warning "address of 'D::c'" }
T (d->c->b); // { dg-warning "address of 'C::b'" }
T (d->c[1].b->a); // { dg-warning "address of 'B::a'" }
T (d->c->b[2].a->ia); // { dg-warning "address of 'A::ia'" }
if (d->c->b[2].a[1].ia) // { dg-warning "address of 'A::ia'" }
T (0);
if (bool b = d->c->b[1].a) // { dg-warning "address of 'B::a'" }
T (b);
/* The following is represented as a declaration of P followed
by an if statement and so it isn't diagnosed. It's not clear
that it should be since the pointer is then used.
void *p = d->c->b[2].a;
if (p) ...
*/
if (void *p = d->c->b[2].a) // { dg-warning "address of 'A::ia'" "" { xfail *-*-* } }
T (p);
}
void test_waddress_2d (int i)
{
D d[2][3]; // { dg-message "'d' declared here" }
T (d); // { dg-warning "address of 'd'" }
T (d == nullptr); // { dg-warning "address of 'd'" }
T (&d); // { dg-warning "address of 'd'" }
T (*d); // { dg-warning "address of 'd'" }
T (d[1] != nullptr); // { dg-warning "address of 'd'" }
T (&d[1]->c); // { dg-warning "address of 'D::c'" }
T (d[1]->c); // { dg-warning "address of 'D::c'" }
T (d[1]->c == nullptr); // { dg-warning "address of 'D::c'" }
T (d[i]->c[1].b); // { dg-warning "address of 'C::b'" }
T ((*(d + i))->c->b->a); // { dg-warning "address of 'B::a'" }
T (d[1][2].c->b->a->ia); // { dg-warning "address of 'A::ia'" }
}