diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c85115e42b2..cbab739740c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-02-12 Jason Merrill + + PR c++/24996 + * except.c (build_throw): Add a CLEANUP_POINT_EXPR inside the + TRY_CATCH_EXPR or MUST_NOT_THROW_EXPR. + 2006-02-10 Volker Reichelt * class.c (debug_class): Remove extern. diff --git a/gcc/cp/except.c b/gcc/cp/except.c index be7208e2f0f..9041342ba32 100644 --- a/gcc/cp/except.c +++ b/gcc/cp/except.c @@ -722,6 +722,7 @@ build_throw (tree exp) temp_expr = NULL_TREE; stabilize_init (exp, &temp_expr); + exp = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (exp), exp); if (elided) exp = build2 (TRY_CATCH_EXPR, void_type_node, exp, do_free_exception (ptr)); diff --git a/gcc/testsuite/g++.dg/eh/cond3.C b/gcc/testsuite/g++.dg/eh/cond3.C new file mode 100644 index 00000000000..0af4ecdad96 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cond3.C @@ -0,0 +1,10 @@ +// PR c++/24996 +// Bug: the cleanup for the A temporary was confusing the gimplifier +// because of the TRY_CATCH_EXPR for the exception object. + +struct A { A(int); ~A(); }; +struct B { B(A); ~B(); }; +void foo(bool b) +{ + throw b ? B(1) : B(1); +}