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  <pola...@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

Reply via email to