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> 2001-04-20 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (finish_enum): Change prototype. * cp-tree.h (finish_enum): Change prototype.
......
...@@ -46,7 +46,6 @@ static bool decl_is_java_type PARAMS ((tree decl, int err)); ...@@ -46,7 +46,6 @@ static bool decl_is_java_type PARAMS ((tree decl, int err));
static void choose_personality_routine PARAMS ((bool)); static void choose_personality_routine PARAMS ((bool));
static void initialize_handler_parm PARAMS ((tree, tree)); static void initialize_handler_parm PARAMS ((tree, tree));
static tree do_allocate_exception PARAMS ((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 int complete_ptr_ref_or_void_ptr_p PARAMS ((tree, tree));
static bool is_admissible_throw_operand PARAMS ((tree)); static bool is_admissible_throw_operand PARAMS ((tree));
static int can_convert_eh PARAMS ((tree, tree)); static int can_convert_eh PARAMS ((tree, tree));
...@@ -504,8 +503,9 @@ do_allocate_exception (type) ...@@ -504,8 +503,9 @@ do_allocate_exception (type)
NULL_TREE)); NULL_TREE));
} }
/* Call __cxa_free_exception from a cleanup. This is invoked when #if 0
a constructor for a thrown object throws. */ /* Call __cxa_free_exception from a cleanup. This is never invoked
directly. */
static tree static tree
do_free_exception (ptr) do_free_exception (ptr)
...@@ -525,6 +525,7 @@ do_free_exception (ptr) ...@@ -525,6 +525,7 @@ do_free_exception (ptr)
return build_function_call (fn, tree_cons (NULL_TREE, ptr, NULL_TREE)); return build_function_call (fn, tree_cons (NULL_TREE, ptr, NULL_TREE));
} }
#endif
/* Build a throw expression. */ /* Build a throw expression. */
...@@ -573,7 +574,6 @@ build_throw (exp) ...@@ -573,7 +574,6 @@ build_throw (exp)
tree cleanup; tree cleanup;
tree stmt_expr; tree stmt_expr;
tree compound_stmt; tree compound_stmt;
tree try_block;
tree object, ptr; tree object, ptr;
tree tmp; tree tmp;
...@@ -645,15 +645,12 @@ build_throw (exp) ...@@ -645,15 +645,12 @@ build_throw (exp)
object = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (exp)), ptr); object = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (exp)), ptr);
object = build_indirect_ref (object, NULL_PTR); object = build_indirect_ref (object, NULL_PTR);
try_block = begin_try_block ();
exp = build_modify_expr (object, INIT_EXPR, exp); exp = build_modify_expr (object, INIT_EXPR, exp);
if (exp == error_mark_node) if (exp == error_mark_node)
error (" in thrown expression"); error (" in thrown expression");
exp = build1 (MUST_NOT_THROW_EXPR, TREE_TYPE (exp), exp);
finish_expr_stmt (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))); 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