(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
eh/
array2.C
// Test that we clean up the right number of array elements when
// a temporary destructor throws.
// { dg-do run }

#if __cplusplus > 201100L
#define THROWING noexcept(false)
#else
#define THROWING
#endif

extern "C" void abort ();

int b;
int d = -1;
struct A {
  A() { }
  A(const A&);
  ~A() THROWING {
    if (b == d) throw b;
  }
};
struct B {
  B(const A& = A()) { ++b; }
  B(const B&);
  ~B() { --b; }
};
void f()
{
  b = 0;
  try
    {
      B bs[3];
      if (b != 3) abort ();
    }
  catch (int i) { }
  if (b != 0) abort ();
}

int main()
{
  for (d = 0; d <= 3; ++d)
    f();
}