// { dg-do run }
// Copyright (C) 1999 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 21 Nov 1999 <nathan@acm.org>
// make sure we don't call base dtors, if we failed to call the
// base ctor due to exception throwing
#include <stdio.h>
static bool bad = false;
static int thrower ()
{
printf ("in %s\n", __PRETTY_FUNCTION__);
throw 0;
return 0;
}
struct X
{
X (int) throw (int);
~X () throw ();
};
X::X (int) throw (int)
{printf ("in ctor X %s\n", __PRETTY_FUNCTION__); bad = true;}
X::~X () throw ()
{printf ("in dtor X %s\n", __PRETTY_FUNCTION__); bad = true;}
struct X1 {};
struct Y : X
{
Y() throw (int);
~Y() throw ();
};
Y::Y() throw (int)
: X(thrower ()) // throws, so X::X is never called
{printf ("in ctor Y%s\n", __PRETTY_FUNCTION__); bad = true;}
Y::~Y() throw ()
{printf ("in dtor Y%s\n", __PRETTY_FUNCTION__); bad = true;}
int main ()
{
try
{
Y y;
}
catch (...)
{
printf ("caught\n");
}
return bad;
}