re PR c++/83634 (ICE in useless_type_conversion_p, at gimple-expr.c:86)
authorJakub Jelinek <jakub@redhat.com>
Wed, 3 Jan 2018 12:16:13 +0000 (13:16 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 3 Jan 2018 12:16:13 +0000 (13:16 +0100)
PR c++/83634
* cp-gimplify.c (cp_fold) <case NOP_EXPR>: If the operand folds to
error_mark_node, return error_mark_node.

* g++.dg/parse/pr83634.C: New test.

From-SVN: r256174

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/pr83634.C [new file with mode: 0644]

index 750a9a8f94fee76417b1bdb392f8a24056957815..9dfb293e7f3c6056f264ae4d10c11f02ceb5fa81 100644 (file)
@@ -1,5 +1,9 @@
 2018-01-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/83634
+       * cp-gimplify.c (cp_fold) <case NOP_EXPR>: If the operand folds to
+       error_mark_node, return error_mark_node.
+
        Update copyright years.
 
 2018-01-02  Jakub Jelinek  <jakub@redhat.com>
index 4f607289539087ff754810d26175aaaa82d3bdf0..c090ee7fcbd79b0a7eaa2900689eb6cc8970862c 100644 (file)
@@ -2112,7 +2112,20 @@ cp_fold (tree x)
     case NON_LVALUE_EXPR:
 
       if (VOID_TYPE_P (TREE_TYPE (x)))
-       return x;
+       {
+         /* This is just to make sure we don't end up with casts to
+            void from error_mark_node.  If we just return x, then
+            cp_fold_r might fold the operand into error_mark_node and
+            leave the conversion in the IR.  STRIP_USELESS_TYPE_CONVERSION
+            during gimplification doesn't like such casts.
+            Don't create a new tree if op0 != TREE_OPERAND (x, 0), the
+            folding of the operand should be in the caches and if in cp_fold_r
+            it will modify it in place.  */
+         op0 = cp_fold (TREE_OPERAND (x, 0));
+         if (op0 == error_mark_node)
+           x = error_mark_node;
+         break;
+       }
 
       loc = EXPR_LOCATION (x);
       op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops);
index 822c29d640dd05d5799a8684678b9faa135f0392..cff788b6a925848669f19609982fa29655fd0129 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/83634
+       * g++.dg/parse/pr83634.C: New test.
+
 2018-01-03  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/83664
diff --git a/gcc/testsuite/g++.dg/parse/pr83634.C b/gcc/testsuite/g++.dg/parse/pr83634.C
new file mode 100644 (file)
index 0000000..70a396e
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/83634
+// { dg-do compile }
+
+void
+foo ()
+{
+  const int x = fn ();         // { dg-error "was not declared in this scope" }
+  short n;
+  for (n = x; n < 100; ++n)
+    ;
+}