// { 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; }