83 lines
1.3 KiB
C
83 lines
1.3 KiB
C
/* 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"} } */
|