1// PR middle-end/15054 2// This used to abort due to overlapping stack temporaries. 3 4// { dg-do run } 5// { dg-options "-O" } 6 7extern "C" void abort (void); 8 9struct pointer 10{ 11 void* ptr; 12 13 pointer(void* x = 0) : ptr(x) {} 14 pointer(const pointer& x) : ptr(x.ptr) {} 15}; 16 17struct element 18{ 19 int canary; 20 21 element() : canary(123) { } 22 ~element() { pointer(); if (canary != 123) abort (); } 23}; 24 25inline pointer 26insert(const element& x) 27{ 28 return pointer(new element(x)); 29} 30 31int 32main (void) 33{ 34 insert(element()); 35 return 0; 36} 37