blob: c9b7af2d8710f205832b065db1d0cbe0713fdab8 [file] [log] [blame]
// Testcase for invocation of constructors/destructors in operator new[].
// { dg-do run }
#include <stdlib.h>
struct E {
virtual ~E() { }
};
struct S {
S();
~S();
};
static int count;
static int max;
static int throwAfter = -1;
static S *pS;
S::S()
{
if (throwAfter >= 0 && count >= throwAfter)
throw E();
if (pS)
{
++pS;
if (this != pS)
abort();
}
else
pS = this;
++count;
max = count;
}
S::~S()
{
if (count > 1)
{
if (this != pS)
abort();
--pS;
}
else
pS = 0;
--count;
}
void __attribute__((noinline)) doit(int n)
{
{
S *s = new S[n];
if (count != n)
abort();
if (pS != s + n - 1)
abort();
delete [] s;
if (count != 0)
abort();
}
throwAfter = 2;
max = 0;
try
{
new S[n];
abort();
}
catch (E)
{
if (max != 2)
abort();
}
throwAfter = -1;
}
int main()
{
{
S s;
if (count != 1)
abort();
if (pS != &s)
abort();
}
if (count != 0)
abort();
{
S *s = new S;
if (count != 1)
abort();
if (pS != s)
abort();
delete s;
if (count != 0)
abort();
}
{
S *s = new S[1];
if (count != 1)
abort();
if (pS != s)
abort();
delete [] s;
if (count != 0)
abort();
}
{
S *s = new S[5];
if (count != 5)
abort();
if (pS != s + 4)
abort();
delete [] s;
if (count != 0)
abort();
}
typedef S A[5];
{
S *s = new A;
if (count != 5)
abort();
if (pS != s + 4)
abort();
delete [] s;
if (count != 0)
abort();
}
throwAfter = 2;
max = 0;
try
{
new S[5];
abort();
}
catch (E)
{
if (max != 2)
abort();
}
max = 0;
try
{
new A;
abort();
}
catch (E)
{
if (max != 2)
abort();
}
throwAfter = -1;
doit(5);
}