blob: f4876d8a269d2f825466759970c307edc5cd50f2 [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" } */
void* operator new (__SIZE_TYPE__, void *p) { return p; }
void* operator new[] (__SIZE_TYPE__, void *p) { return p; }
struct A
{
int ai;
virtual ~A ();
};
struct B: virtual A { };
struct C: virtual A
{
int ci;
C ();
};
struct D1: virtual B, virtual C
{
/* The warning would ideally point to the assignment but instead points
to the opening brace. */
D1 ()
{ // { dg-warning "\\\[-Warray-bounds" "brace" }
ci = 0; // { dg-warning "\\\[-Warray-bounds" "assign" { xfail lp64 } }
}
};
void sink (void*);
void warn_derived_ctor_access_new_decl ()
{
char a[sizeof (D1)]; // { dg-message "at offset 1 into object 'a' of size 40" "LP64 note" { target lp64} }
// { dg-message "at offset 1 into object 'a' of size 20" "LP64 note" { target ilp32} .-1 }
char *p = a;
++p;
D1 *q = new (p) D1;
sink (q);
}
void warn_derived_ctor_access_new_alloc ()
{
char *p = (char*)operator new (sizeof (D1)); // { dg-message "at offset 1 into object of size \\d+ allocated by '\[^\n\r]*operator new\[^\n\r]*'" "note" }
++p;
D1 *q = new (p) D1;
sink (q);
}
void warn_derived_ctor_access_new_array_decl ()
{
char b[sizeof (D1) * 2]; // { dg-message "at offset \\d+ into object 'b' of size 80" "LP64 note" { target lp64 } }
// { dg-message "at offset \\d+ into object 'b' of size 40" "LP64 note" { target ilp32 } .-1 }
char *p = b;
++p;
D1 *q = new (p) D1[2];
sink (q);
}
void warn_derived_ctor_access_new_array_alloc ()
{
char *p = new char[sizeof (D1) * 2]; // { dg-message "at offset \\d+ into object of size \\d+ allocated by '\[^\n\r]*operator new\[^\n\r]*" "note" }
++p;
D1 *q = new (p) D1[2];
sink (q);
}