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