Viewing file: Warray-bounds-18.C (3.83 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* 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); }
|