1 // PR c++/33407
2 // { dg-do run }
3 // { dg-options "-O2 -fstrict-aliasing" }
4 
5 extern "C" void * malloc(__SIZE_TYPE__);
6 extern "C" void abort(void);
7 
8 void *p;
init(void)9 void __attribute__((noinline)) init(void)
10 {
11   p = malloc(4);
12 }
13 
new(__SIZE_TYPE__)14 inline void *operator new(__SIZE_TYPE__)
15 {
16   return p;
17 }
18 
19 // C++11 and earlier
delete(void *)20 inline void operator delete (void*) {}
21 
22 // C++14 profile
delete(void *,__SIZE_TYPE__)23 inline void operator delete (void*, __SIZE_TYPE__) {}
24 
doit(int n)25 int * __attribute__((noinline)) doit(int n)
26 {
27   float *q;
28   int *r;
29 
30   for (int i=0; i<n; ++i)
31   {
32     q = new float;
33     *q = 1.0;
34     delete q;
35     r = new int;
36     *r = 1;
37   }
38 
39   return r;
40 }
41 
main()42 int main()
43 {
44   init();
45   if (*doit(1) != 1)
46     abort();
47   return 0;
48 }
49