| // PR c++/34862 |
| // { dg-do run } |
| // { dg-options "-O2" } |
| |
| typedef __SIZE_TYPE__ size_t; |
| extern "C" void abort (); |
| |
| struct T |
| { |
| void *operator new (size_t, char *&); |
| T () { i[0] = 1; i[1] = 2; } |
| int i[2]; |
| }; |
| |
| void * |
| T::operator new (size_t size, char *&p) |
| { |
| void *o = (void *) p; |
| p += size; |
| return o; |
| } |
| |
| T * |
| f (char *&x) |
| { |
| return new (x) T (); |
| } |
| |
| char buf[10 * sizeof (T)] __attribute__((aligned (__alignof (T)))); |
| |
| int |
| main () |
| { |
| char *p = buf; |
| T *t = f (p); |
| if (p != buf + sizeof (T)) |
| abort (); |
| if (t->i[0] != 1 || t->i[1] != 2) |
| abort (); |
| } |