aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-09-08 23:31:36 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2008-09-08 23:31:36 +0200
commit9cfa22be65408f2f21ef2c0cc0493ee39063174e (patch)
tree8f2638e1258e2b781f974fafbb68425e89ff40fc /gcc
parent7f4b6d207c7b950f54cf32b06b2835e960ba8c77 (diff)
downloadgcc-9cfa22be65408f2f21ef2c0cc0493ee39063174e.zip
gcc-9cfa22be65408f2f21ef2c0cc0493ee39063174e.tar.gz
gcc-9cfa22be65408f2f21ef2c0cc0493ee39063174e.tar.bz2
re PR middle-end/37393 (error: EH edge 10->12 is missing)
PR middle-end/37393 * tree-inline.c (copy_bb): When replacing a gimple_call_va_arg_pack_p call stmt by new_call, clear gimple_bb on stmt after gsi_replace. * g++.dg/tree-ssa/pr37393.C: New test. From-SVN: r140123
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr37393.C27
-rw-r--r--gcc/tree-inline.c1
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 60ff6e9..d5c28ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2008-09-08 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/37393
+ * tree-inline.c (copy_bb): When replacing a gimple_call_va_arg_pack_p
+ call stmt by new_call, clear gimple_bb on stmt after gsi_replace.
+
PR middle-end/37414
* predict.c (optimize_function_for_size_p): Don't segfault if
FUN is NULL.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f5aec00..d8e57165 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2008-09-08 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/37393
+ * g++.dg/tree-ssa/pr37393.C: New test.
+
PR middle-end/37414
* g++.dg/opt/init2.C: New test.
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr37393.C b/gcc/testsuite/g++.dg/tree-ssa/pr37393.C
new file mode 100644
index 0000000..2f9281c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr37393.C
@@ -0,0 +1,27 @@
+// PR middle-end/37393
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct A
+{
+ ~A ();
+ bool foo () const;
+};
+
+extern "C"
+{
+ extern void bar (const char *, ...) __attribute__ ((noreturn));
+ extern inline __attribute__ ((always_inline, gnu_inline, artificial)) void
+ baz (const char *fmt, ...)
+ {
+ bar (fmt, __builtin_va_arg_pack ());
+ }
+};
+
+void
+test ()
+{
+ A a;
+ if (a.foo ())
+ baz ("foo");
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 8b603f0..d083a54 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -1331,6 +1331,7 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
gimple_call_set_lhs (new_call, gimple_call_lhs (stmt));
gsi_replace (&copy_gsi, new_call, false);
+ gimple_set_bb (stmt, NULL);
stmt = new_call;
}
else if (is_gimple_call (stmt)