| /* PR tree-optimization/92765 - wrong code for strcmp of a union member |
| { dg-do run } |
| { dg-options "-O2 -Wall" } */ |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| inline void* operator new (size_t, void *p) |
| { |
| return p; |
| } |
| |
| struct A { char a2[2]; }; |
| struct B { char a4[4]; }; |
| |
| __attribute__((noipa)) void |
| sink (void*) { } |
| |
| __attribute__((noipa)) void |
| copy (char *d, const char *s) |
| { |
| while ((*d++ = *s++)); |
| } |
| |
| __attribute__((noipa)) void |
| store_and_compare (void *p) |
| { |
| A *a = new (p) A; |
| sink (a->a2); |
| |
| B *b = new (p) B; |
| char *q = (char *) b->a4; |
| copy (q, "abc"); |
| |
| if (__builtin_strcmp (q, "abc")) |
| __builtin_abort (); |
| } |
| |
| int main () |
| { |
| char a [sizeof (A) > sizeof (B) ? sizeof (A) : sizeof (B)]; |
| store_and_compare (a); |
| } |