Commit 2ac8a0f9 by Jason Merrill Committed by Jason Merrill

except.c (build_throw): Wrap the initialization of the exception object in a MUST_NOT_THROW_EXPR.

        * except.c (build_throw): Wrap the initialization of the exception
        object in a MUST_NOT_THROW_EXPR.
        (do_free_exception): #if 0.

From-SVN: r41494
parent 146ef880
2001-04-23 Jason Merrill <jason_merrill@redhat.com>
* except.c (build_throw): Wrap the initialization of the exception
object in a MUST_NOT_THROW_EXPR.
(do_free_exception): #if 0.
2001-04-20 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (finish_enum): Change prototype.
......
......@@ -46,7 +46,6 @@ static bool decl_is_java_type PARAMS ((tree decl, int err));
static void choose_personality_routine PARAMS ((bool));
static void initialize_handler_parm PARAMS ((tree, tree));
static tree do_allocate_exception PARAMS ((tree));
static tree do_free_exception PARAMS ((tree));
static int complete_ptr_ref_or_void_ptr_p PARAMS ((tree, tree));
static bool is_admissible_throw_operand PARAMS ((tree));
static int can_convert_eh PARAMS ((tree, tree));
......@@ -504,8 +503,9 @@ do_allocate_exception (type)
NULL_TREE));
}
/* Call __cxa_free_exception from a cleanup. This is invoked when
a constructor for a thrown object throws. */
#if 0
/* Call __cxa_free_exception from a cleanup. This is never invoked
directly. */
static tree
do_free_exception (ptr)
......@@ -525,6 +525,7 @@ do_free_exception (ptr)
return build_function_call (fn, tree_cons (NULL_TREE, ptr, NULL_TREE));
}
#endif
/* Build a throw expression. */
......@@ -573,7 +574,6 @@ build_throw (exp)
tree cleanup;
tree stmt_expr;
tree compound_stmt;
tree try_block;
tree object, ptr;
tree tmp;
......@@ -645,15 +645,12 @@ build_throw (exp)
object = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (exp)), ptr);
object = build_indirect_ref (object, NULL_PTR);
try_block = begin_try_block ();
exp = build_modify_expr (object, INIT_EXPR, exp);
if (exp == error_mark_node)
error (" in thrown expression");
exp = build1 (MUST_NOT_THROW_EXPR, TREE_TYPE (exp), exp);
finish_expr_stmt (exp);
finish_cleanup_try_block (try_block);
finish_cleanup (do_free_exception (ptr), try_block);
throw_type = build_eh_type_type (prepare_eh_type (TREE_TYPE (object)));
......
// Test that an exception thrown out of the constructor for the exception
// object (i.e. "after completing evaluation of the expression to be thrown
// but before the exception is caught") causes us to call terminate.
#include <exception>
#include <cstdlib>
void my_terminate ()
{
std::exit (0);
}
struct A
{
A () {}
A (const A&) { throw 1; }
};
int main (void)
{
std::set_terminate (my_terminate);
A a;
try { throw a; }
catch (...) {}
return 1;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment