// { dg-do run }

// Copyright (C) 2002 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 12 Oct 2002 <nathan@codesourcery.com>

// From WindRiver SPR 80797
// We were inadvertently SAVE_EXPRing volatile arrays during delete[]

struct A
{
  A *ptr;
  static int ok;
  
  A () {ptr = this;}
  ~A () {ok = ptr == this;}
};
int A::ok = -1;

struct B
{
  B *ptr;
  static int ok;
  
  B () {ptr = this;}
  ~B () {ok = ptr == this;}
};
int B::ok = -1;

struct C
{
  A volatile a;
  B volatile b[1];

  C ();
};

C::C ()
{
  throw 1;
}

int main ()
{
  try
    {
      C c;
    }
  catch (...)
    {
      if (A::ok != 1)
	return 1;
      if (B::ok != 1)
	return 2;
      return 0;
    }
  return 3;
}