| /* 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); |
| } |