This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix middle-end/71308
- From: Marek Polacek <polacek at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 27 May 2016 13:52:34 +0200
- Subject: Fix middle-end/71308
- Authentication-results: sourceware.org; auth=none
A stupid mistake of mine. When I introduced the should_remove_lhs_p call,
I removed the check for LHS here, because should_remove_lhs_p checks that.
Well, in this case the LHS was NULL, but gimple_call_fntype (stmt) had void
type, so we went on and crashed on the SSA_NAME check. Sorry. But at least
we have a test exercising this path.
Bootstrapped/regtested on x86_64-linux, ok for trunk?
2016-05-27 Marek Polacek <polacek@redhat.com>
PR middle-end/71308
* gimple-fold.c (gimple_fold_call): Check that LHS is not null.
* g++.dg/torture/pr71308.C: New test.
diff --git gcc/gimple-fold.c gcc/gimple-fold.c
index d6657e9..600aa72 100644
--- gcc/gimple-fold.c
+++ gcc/gimple-fold.c
@@ -3053,7 +3053,8 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
== void_type_node))
gimple_call_set_fntype (stmt, TREE_TYPE (fndecl));
/* If the call becomes noreturn, remove the lhs. */
- if (gimple_call_noreturn_p (stmt)
+ if (lhs
+ && gimple_call_noreturn_p (stmt)
&& (VOID_TYPE_P (TREE_TYPE (gimple_call_fntype (stmt)))
|| should_remove_lhs_p (lhs)))
{
diff --git gcc/testsuite/g++.dg/torture/pr71308.C gcc/testsuite/g++.dg/torture/pr71308.C
index e69de29..ff5cd95 100644
--- gcc/testsuite/g++.dg/torture/pr71308.C
+++ gcc/testsuite/g++.dg/torture/pr71308.C
@@ -0,0 +1,18 @@
+// PR middle-end/71308
+// { dg-do compile }
+
+class S
+{
+ void foo ();
+ virtual void bar () = 0;
+ virtual ~S ();
+};
+inline void
+S::foo ()
+{
+ bar ();
+};
+S::~S ()
+{
+ foo ();
+}
Marek