diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-09-08 23:31:36 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-09-08 23:31:36 +0200 |
commit | 9cfa22be65408f2f21ef2c0cc0493ee39063174e (patch) | |
tree | 8f2638e1258e2b781f974fafbb68425e89ff40fc /gcc | |
parent | 7f4b6d207c7b950f54cf32b06b2835e960ba8c77 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr37393.C | 27 | ||||
-rw-r--r-- | gcc/tree-inline.c | 1 |
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 (©_gsi, new_call, false); + gimple_set_bb (stmt, NULL); stmt = new_call; } else if (is_gimple_call (stmt) |