From 73bb17ceddeaafacaf347e7570eb24dfaeed452c Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 14 May 2010 18:55:10 +0000 Subject: [PATCH] PR c++/44127 gcc: * gimplify.c (gimplify_seq_add_stmt): No longer static. * gimple.h: Declare it. * gimple.c (gimple_build_eh_filter): No ops. gcc/cp: * cp-gimplify.c (gimplify_must_not_throw_expr): Use gimple_build_eh_must_not_throw. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159407 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/cp/ChangeLog | 6 ++++++ gcc/cp/cp-gimplify.c | 11 ++++++++--- gcc/gimple.c | 2 +- gcc/gimple.h | 7 +++++++ gcc/gimplify.c | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/eh/terminate1.C | 23 +++++++++++++++++++++++ 8 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/eh/terminate1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e803c1345354..a5309e176498 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-05-14 Jason Merrill + + PR c++/44127 + * gimplify.c (gimplify_seq_add_stmt): No longer static. + * gimple.h: Declare it. + * gimple.c (gimple_build_eh_filter): No ops. + 2010-05-14 Jan Hubicka * ipa.c (enqueue_cgraph_node): Update comment; do not re-enqueue diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a68f71c58f3f..eca1aaaa92c7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2010-05-14 Jason Merrill + + PR c++/44127 + * cp-gimplify.c (gimplify_must_not_throw_expr): Use + gimple_build_eh_must_not_throw. + 2010-05-14 Martin Jambor * cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Remove both its undef diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index d6ae28fb97d6..2e3f11d09466 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -480,11 +480,16 @@ gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p) tree stmt = *expr_p; tree temp = voidify_wrapper_expr (stmt, NULL); tree body = TREE_OPERAND (stmt, 0); + gimple_seq try_ = NULL; + gimple_seq catch_ = NULL; + gimple mnt; - stmt = build_gimple_eh_filter_tree (body, NULL_TREE, - build_call_n (terminate_node, 0)); + gimplify_and_add (body, &try_); + mnt = gimple_build_eh_must_not_throw (terminate_node); + gimplify_seq_add_stmt (&catch_, mnt); + mnt = gimple_build_try (try_, catch_, GIMPLE_TRY_CATCH); - gimplify_and_add (stmt, pre_p); + gimplify_seq_add_stmt (pre_p, mnt); if (temp) { *expr_p = temp; diff --git a/gcc/gimple.c b/gcc/gimple.c index 6f61ca7935a0..dd691a810d25 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -636,7 +636,7 @@ gimple_build_eh_filter (tree types, gimple_seq failure) gimple gimple_build_eh_must_not_throw (tree decl) { - gimple p = gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 1); + gimple p = gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0); gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN); diff --git a/gcc/gimple.h b/gcc/gimple.h index d1018b70c0aa..8ecf7eb0a4ed 100644 --- a/gcc/gimple.h +++ b/gcc/gimple.h @@ -221,6 +221,13 @@ gimple_seq_empty_p (const_gimple_seq s) void gimple_seq_add_stmt (gimple_seq *, gimple); +/* Link gimple statement GS to the end of the sequence *SEQ_P. If + *SEQ_P is NULL, a new sequence is allocated. This function is + similar to gimple_seq_add_stmt, but does not scan the operands. + During gimplification, we need to manipulate statement sequences + before the def/use vectors have been constructed. */ +void gimplify_seq_add_stmt (gimple_seq *, gimple); + /* Allocate a new sequence and initialize its first element with STMT. */ static inline gimple_seq diff --git a/gcc/gimplify.c b/gcc/gimplify.c index c74189194bd4..6d00fefe9ad4 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -158,7 +158,7 @@ gimple_tree_eq (const void *p1, const void *p2) During gimplification, we need to manipulate statement sequences before the def/use vectors have been constructed. */ -static void +void gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs) { gimple_stmt_iterator si; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 92f955991be4..331b142e024e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-05-14 Jason Merrill + + PR c++/44127 + * g++.dg/eh/terminate1.C: New. + 2010-05-14 Jakub Jelinek * gfortran.dg/gomp/pr44036-1.f90: Adjust. diff --git a/gcc/testsuite/g++.dg/eh/terminate1.C b/gcc/testsuite/g++.dg/eh/terminate1.C new file mode 100644 index 000000000000..cd60bccb48b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/terminate1.C @@ -0,0 +1,23 @@ +// PR c++/44127 + +// This is basically the same test as g++.eh/terminate1.C, but that one +// tests runtime behavior and this tests the assembly output. The test +// should call terminate (because initializing the catch parm throws), but +// from the personality routine, not directly. + +// { dg-final { scan-assembler-not "_ZSt9terminatev" } } + +struct A +{ + A() { } + A (const A&) { throw 1; } +}; + +int main() +{ + try + { + throw A(); + } + catch (A) { } +} -- 2.47.2