blob: 53d93cf83e71ee8e7bc1b8900d3ee874256033df [file] [log] [blame]
/* PR middle-end/98266 - bogus array subscript is partly outside array
bounds on virtual inheritance
{ dg-do compile }
{ dg-options "-O2 -Wall" } */
struct A
{
int ai, aj, aa[2];
virtual ~A ();
};
struct B: virtual A { };
struct C: virtual A { };
void sink (void*);
struct C1: virtual A
{
int c2i, c2j, c2a[2];
C1 ();
~C1 ()
{ // { dg-bogus "\\\[-Warray-bounds" }
c2i = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
c2j = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
c2a[0] = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
c2a[1] = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
c2a[2] = __LINE__; // { dg-warning "\\\[-Warray-bounds" }
}
};
struct D1: virtual B, virtual C1
{
D1 ();
};
void sink (void*);
/* Verify that only out of bounds accesses to members of an ordinary base
class are diagnosed. Use direct array accesses. */
void test_vmem_base_ctor_arryaccess ()
{
D1 d2;
sink (&d2);
}
struct C2: virtual A
{
int c3a[2];
C2 ();
~C2 ()
{ // { dg-bogus "\\\[-Warray-bounds" }
int *p = c3a;
*p++ = __LINE__;
*p++ = __LINE__;
*p++ = __LINE__; // { dg-warning "\\\[-Warray-bounds" }
}
};
struct D2: virtual B, virtual C2
{
D2 ();
};
/* Verify that only out of bounds accesses to members of an ordinary base
class are diagnosed. Use pointer accesses. */
void test_vmem_base_dtor_ptraccess ()
{
D2 d3;
sink (&d3);
}
struct C3: virtual A // { dg-bogus "\\\[-Warray-bounds" }
{
int i, j, a[2];
C3 ();
};
struct D3: virtual B, virtual C3
{
D3 ()
{ // { dg-bogus "\\\[-Warray-bounds" }
i = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
j = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
a[0] = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
a[1] = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
a[2] = __LINE__; // { dg-warning "\\\[-Warray-bounds" }
}
};
/* Verify that only out of bounds accesses to members of an ordinary base
class made in the ctor of a derived class are diagnosed. Use direct
array accesses. */
void test_vmem_derived_ctor_arryaccess ()
{
D3 d4;
sink (&d4);
}
struct D4: virtual B, virtual C3
{
D4 ()
{ // { dg-bogus "\\\[-Warray-bounds" }
int *p = a;
*p++ = __LINE__;
*p++ = __LINE__;
*p++ = __LINE__; // { dg-warning "\\\[-Warray-bounds" }
}
};
/* Verify that only out of bounds accesses to members of an ordinary base
class made in the ctor of a derived class are diagnosed. Use pointer
accesses. */
void test_vmem_derived_ctor_ptraccess ()
{
D4 d5;
sink (&d5);
}
struct D5: virtual B, virtual C3 // { dg-bogus "\\\[-Warray-bounds" }
{
~D5 ()
{
i = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
j = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
a[0] = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
a[1] = __LINE__; // { dg-bogus "\\\[-Warray-bounds" }
a[2] = __LINE__; // { dg-warning "\\\[-Warray-bounds" }
}
};
/* Verify that only out of bounds accesses to members of an ordinary base
class made in the dtor of a derived class are diagnosed. Use pointer
accesses. */
void test_vmem_derived_dtor_arryaccess ()
{
D5 d6;
sink (&d6);
}
struct D6: virtual B, virtual C3 // { dg-bogus "\\\[-Warray-bounds" }
{
~D6 ()
{
int *p = a;
*p++ = __LINE__;
*p++ = __LINE__;
*p++ = __LINE__; // { dg-warning "\\\[-Warray-bounds" }
}
};
/* Verify that only out of bounds accesses to members of an ordinary base
class made in the dtor of a derived class are diagnosed. Use pointer
accesses. */
void test_vmem_derived_dtor_ptraccess ()
{
D6 d7;
sink (&d7);
}