(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
warn/
Warray-bounds-22.C
/* PR middle-end/99502 - missing -Warray-bounds on partial out of bounds
   access in C++
   { dg-do compile }
   { dg-options "-O2 -Wall" } */

typedef __INT8_TYPE__  int8_t;
typedef __INT16_TYPE__ int16_t;
typedef __INT32_TYPE__ int32_t;

struct POD32
{
  int32_t i32;
};

int8_t a16[2];
int8_t apod32[sizeof (POD32)];

void nowarn_pod32_assign ()
{
  POD32 *p = (POD32*)apod32;
  *p = POD32 ();
}

void nowarn_pod32_assign_member ()
{
  POD32 *p = (POD32*)apod32;
  p->i32 = __LINE__;
}


void warn_pod32_assign ()
{
  POD32 *p = (POD32*)a16;
  *p = POD32 ();              // { dg-warning "-Warray-bounds" }
}

void warn_pod32_assign_member ()
{
  POD32 *p = (POD32*)a16;
  p->i32 = __LINE__;          // { dg-warning "-Warray-bounds" }
}


struct BV32                   // { dg-warning "-Warray-bounds" "due to pr99525" }
{
  int32_t i32;

  virtual ~BV32 ();
};

int8_t abv32[sizeof (BV32)];

void nowarn_bv32_assign ()
{
  BV32 *p = (BV32*)abv32;
  *p = BV32 ();
}

void nowarn_bv32_assign_member ()
{
  BV32 *p = (BV32*)abv32;
  p->i32 = __LINE__;
}

void warn_bv32_assign ()
{
  BV32 *p = (BV32*)a16;
  *p = BV32 ();                // { dg-warning "-Warray-bounds" "pr99525" { xfail *-*-* } }
}

void warn_bv32_assign_member ()
{
  BV32 *p = (BV32*)a16;
  p->i32 = __LINE__;          // { dg-warning "-Warray-bounds" }
}


struct DV32: virtual BV32 { };

int8_t adv32[sizeof (DV32)];
int8_t adv32_m1[sizeof adv32 - 1];

void nowarn_dv32_assign ()
{
  DV32 *p = (DV32*)adv32;
  *p = DV32 ();
}

void nowarn_dv32_assign_member ()
{
  DV32 *p = (DV32*)adv32;
  p->i32 = __LINE__;
}

void warn_dv32_assign ()
{
  DV32 *p = (DV32*)adv32_m1;
  *p = DV32 ();                // { dg-warning "-Warray-bounds" "pr?????" { xfail *-*-* } }
}

void warn_dv32_assign_member ()
{
  DV32 *p = (DV32*)adv32_m1;
  p->i32 = __LINE__;          // { dg-warning "-Warray-bounds" "pr?????" { xfail *-*-* } }
}