blob: c43a7dea3efc2dca1858933c09e52e7f0c01be03 [file] [log] [blame]
/* PR middle-end/99502 - missing -Warray-bounds on partial out of bounds
access in C++
{ dg-do compile }
{ dg-options "-O2 -Wall" } */
inline void* operator new (__SIZE_TYPE__, void *p) { return p; }
struct B0 { int b0i; };
struct B1: virtual B0 { int b1i; };
struct B2: virtual B0 { int b2i; };
struct D1: B1, B2 { int d1i; };
struct D2: D1 { int d2i; };
struct D3: D2 { long d3i, d3ax[]; };
void sink (void*);
void test_D1 ()
{
{
char *p = new char[sizeof (D1)];
new (p) D1 ();
sink (p);
}
{
char *p = new char[sizeof (D1) - 1];
new (p) D1 (); // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D1_b0i ()
{
{
D1 *p = (D1*)new char[sizeof (D1)];
p->b0i = __LINE__;
sink (p);
}
{
D1 *p = (D1*)new char[3];
p->b0i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D1_b1i ()
{
{
D1 *p = (D1*)new char[sizeof (D1)];
p->b1i = __LINE__;
sink (p);
}
{
D1 *p = (D1*)new char[3];
p->b1i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D1_b2i ()
{
{
D1 *p = (D1*)new char[sizeof (D1)];
p->b2i = __LINE__;
sink (p);
}
{
D1 *p = (D1*)new char[3];
p->b2i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D1_d1i ()
{
{
D1 *p = (D1*)new char[sizeof (D1)];
p->d1i = __LINE__;
sink (p);
}
{
D1 *p = (D1*)new char[3];
p->d1i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D2 ()
{
{
char *p = new char[sizeof (D2)];
new (p) D2 ();
sink (p);
}
{
char *p = new char[sizeof (D2) - 1];
new (p) D2 (); // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D2_b0i ()
{
{
D2 *p = (D2*)new char[sizeof (D2)];
p->b0i = __LINE__;
sink (p);
}
{
D2 *p = (D2*)new char[3];
p->b0i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D2_b1i ()
{
{
D2 *p = (D2*)new char[sizeof (D2)];
p->b1i = __LINE__;
sink (p);
}
{
D2 *p = (D2*)new char[3];
p->b1i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D2_b2i ()
{
{
D2 *p = (D2*)new char[sizeof (D2)];
p->b2i = __LINE__;
sink (p);
}
{
D2 *p = (D2*)new char[3];
p->b2i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D2_d1i ()
{
{
D2 *p = (D2*)new char[sizeof (D2)];
p->d1i = __LINE__;
sink (p);
}
{
D2 *p = (D2*)new char[3];
p->d1i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D2_d2i ()
{
{
D2 *p = (D2*)new char[sizeof (D2)];
p->d2i = __LINE__;
sink (p);
}
{
D2 *p = (D2*)new char[3];
p->d2i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D3 ()
{
{
char *p = new char[sizeof (D3)];
new (p) D3 ();
sink (p);
}
{
char *p = new char[sizeof (D3) - 1];
new (p) D3 (); // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D3_b0i ()
{
{
D3 *p = (D3*)new char[sizeof (D3)];
p->b0i = __LINE__;
sink (p);
}
{
D3 *p = (D3*)new char[3];
p->b0i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D3_b1i ()
{
{
D3 *p = (D3*)new char[sizeof (D3)];
p->b1i = __LINE__;
sink (p);
}
{
D3 *p = (D3*)new char[3];
p->b1i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D3_b2i ()
{
{
D3 *p = (D3*)new char[sizeof (D3)];
p->b2i = __LINE__;
sink (p);
}
{
D3 *p = (D3*)new char[3];
p->b2i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D3_d1i ()
{
{
D3 *p = (D3*)new char[sizeof (D3)];
p->d1i = __LINE__;
sink (p);
}
{
D3 *p = (D3*)new char[3];
p->d1i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D3_d2i ()
{
{
D3 *p = (D3*)new char[sizeof (D3)];
p->d2i = __LINE__;
sink (p);
}
{
D3 *p = (D3*)new char[3];
p->d2i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D3_d3i ()
{
{
D3 *p = (D3*)new char[sizeof (D3)];
p->d3i = __LINE__;
sink (p);
}
{
D3 *p = (D3*)new char[3];
p->d3i = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
void test_D3_d3ax ()
{
{
D3 *p = (D3*)new char[sizeof (D3)];
*p->d3ax = __LINE__; // { dg-warning "-Warray-bounds" "pr?????" { xfail *-*-* } }
p->d3ax[9] = __LINE__; // { dg-warning "-Warray-bounds" "pr?????" { xfail *-*-* } }
sink (p);
}
{
D3 *p = (D3*)new char[sizeof (D3) + sizeof (D3::d3ax[0])];
p->d3ax[0] = __LINE__;
p->d3ax[1] = __LINE__; // { dg-warning "-Warray-bounds" "pr?????" { xfail *-*-* } }
sink (p);
}
{
D3 *p = (D3*)new char[3];
*p->d3ax = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}
struct D4: D2
{
// D4:d4a0 overlaps with B0:b0i!
long d4i, d4a0[0];
};
void test_D4_d3a0 ()
{
{
D4 *p = (D4*)new char[sizeof (D4)];
*p->d4a0 = __LINE__; // { dg-warning "-Warray-bounds" }
p->d4a0[1] = __LINE__; // { dg-warning "-Warray-bounds" }
p->d4a0[9] = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
{
D4 *p = (D4*)new char[sizeof (D4) + sizeof (D4::d4a0[0])];
/* The access to d4a0[0] should get a -Wzero-length-bounds because
it's in bounds but overlaps p->b0i. */
p->d4a0[0] = __LINE__; // { dg-warning "-Wzero-length-bounds" "pr99635" { xfail *-*-* } }
// { dg-warning "-Warray-bounds" "actual" { target *-*-* } .-1 }
p->d4a0[1] = __LINE__; // { dg-warning "-Warray-bounds" }
p->d4a0[9] = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
{
D4 *p = (D4*)new char[3];
*p->d4a0 = __LINE__; // { dg-warning "-Warray-bounds" }
sink (p);
}
}