re PR c++/24996 (ICE on throw code)

PR c++/24996
        * except.c (build_throw): Add a CLEANUP_POINT_EXPR inside the
        TRY_CATCH_EXPR or MUST_NOT_THROW_EXPR.

From-SVN: r110889
This commit is contained in:
Jason Merrill 2006-02-12 11:02:00 -05:00 committed by Jason Merrill
parent 1d327c160a
commit eecb13e859
3 changed files with 17 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2006-02-12 Jason Merrill <jason@redhat.com>
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 <reichelt@igpm.rwth-aachen.de>
* class.c (debug_class): Remove extern.

View File

@ -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));

View File

@ -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);
}