1//  Copyright (C) 1999 Free Software Foundation, Inc.
2//  Contributed by Nathan Sidwell 21 Nov 1999 <nathan@acm.org>
3
4// make sure we don't call base dtors, if we failed to call the
5// base ctor due to exception throwing
6
7#include <stdio.h>
8
9static bool bad = false;
10
11static int thrower ()
12{
13  printf ("in %s\n", __PRETTY_FUNCTION__);
14  throw 0;
15  return 0;
16}
17
18struct X
19{
20  X (int) throw (int);
21  ~X () throw ();
22};
23
24X::X (int) throw (int)
25  {printf ("in ctor X %s\n", __PRETTY_FUNCTION__); bad = true;}
26X::~X () throw ()
27  {printf ("in dtor X %s\n", __PRETTY_FUNCTION__); bad = true;}
28
29struct X1 {};
30struct Y : X
31{
32  Y() throw (int);
33  ~Y() throw ();
34};
35Y::Y() throw (int)
36  : X(thrower ())   // throws, so X::X is never called
37  {printf ("in ctor Y%s\n", __PRETTY_FUNCTION__); bad = true;}
38Y::~Y() throw ()
39  {printf ("in dtor Y%s\n", __PRETTY_FUNCTION__); bad = true;}
40
41int main ()
42{
43  try
44    {
45      Y y;
46    }
47  catch (...)
48    {
49      printf ("caught\n");
50    }
51  return bad;
52}
53