| /* PR c++/94314. */ |
| /* { dg-do run } */ |
| /* { dg-options "-O2 -fdump-tree-cddce-details -fdelete-null-pointer-checks" } */ |
| |
| struct A |
| { |
| __attribute__((malloc,noinline)) |
| static void* operator new(__SIZE_TYPE__ sz) |
| { |
| ++count; |
| return ::operator new(sz); |
| } |
| |
| static void operator delete(void* ptr) |
| { |
| --count; |
| ::operator delete(ptr); |
| } |
| |
| static int count; |
| }; |
| |
| int A::count = 0; |
| |
| struct B |
| { |
| __attribute__((malloc,noinline)) |
| static void* operator new(__SIZE_TYPE__ sz) |
| { |
| ++count; |
| return ::operator new(sz); |
| } |
| |
| __attribute__((noinline)) |
| static void operator delete(void* ptr) |
| { |
| --count; |
| ::operator delete(ptr); |
| } |
| |
| static int count; |
| }; |
| |
| int B::count = 0; |
| |
| struct C |
| { |
| static void* operator new(__SIZE_TYPE__ sz) |
| { |
| ++count; |
| return ::operator new(sz); |
| } |
| |
| static void operator delete(void* ptr) |
| { |
| --count; |
| ::operator delete(ptr); |
| } |
| |
| static int count; |
| }; |
| |
| int C::count = 0; |
| |
| int main(){ |
| delete new A; |
| if (A::count != 0) |
| __builtin_abort (); |
| |
| delete new B; |
| if (B::count != 0) |
| __builtin_abort (); |
| |
| delete new C; |
| if (C::count != 0) |
| __builtin_abort (); |
| |
| return 0; |
| } |
| |
| /* { dg-final { scan-tree-dump-not "Deleting : operator delete" "cddce1"} } */ |
| /* { dg-final { scan-tree-dump-not "Deleting : B::operator delete" "cddce1"} } */ |