(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
warn/
Warray-bounds-18.C
/* 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);
}