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
+2010-05-14 Jason Merrill <jason@redhat.com>
+
+ 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 <jh@suse.cz>
* ipa.c (enqueue_cgraph_node): Update comment; do not re-enqueue
2010-05-14 Jan Hubicka <jh@suse.cz>
* ipa.c (enqueue_cgraph_node): Update comment; do not re-enqueue
+2010-05-14 Jason Merrill <jason@redhat.com>
+
+ PR c++/44127
+ * cp-gimplify.c (gimplify_must_not_throw_expr): Use
+ gimple_build_eh_must_not_throw.
+
2010-05-14 Martin Jambor <mjambor@suse.cz>
* cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Remove both its undef
2010-05-14 Martin Jambor <mjambor@suse.cz>
* cp-lang.c (LANG_HOOKS_FOLD_OBJ_TYPE_REF): Remove both its undef
tree stmt = *expr_p;
tree temp = voidify_wrapper_expr (stmt, NULL);
tree body = TREE_OPERAND (stmt, 0);
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;
if (temp)
{
*expr_p = temp;
gimple
gimple_build_eh_must_not_throw (tree decl)
{
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);
gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
void gimple_seq_add_stmt (gimple_seq *, gimple);
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
/* Allocate a new sequence and initialize its first element with STMT. */
static inline gimple_seq
During gimplification, we need to manipulate statement sequences
before the def/use vectors have been constructed. */
During gimplification, we need to manipulate statement sequences
before the def/use vectors have been constructed. */
gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs)
{
gimple_stmt_iterator si;
gimplify_seq_add_stmt (gimple_seq *seq_p, gimple gs)
{
gimple_stmt_iterator si;
+2010-05-14 Jason Merrill <jason@redhat.com>
+
+ PR c++/44127
+ * g++.dg/eh/terminate1.C: New.
+
2010-05-14 Jakub Jelinek <jakub@redhat.com>
* gfortran.dg/gomp/pr44036-1.f90: Adjust.
2010-05-14 Jakub Jelinek <jakub@redhat.com>
* gfortran.dg/gomp/pr44036-1.f90: Adjust.
--- /dev/null
+// 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) { }
+}