Hi,

in this error recovery regression, after a sensible error produced by unqualified_name_lookup_error we ICE much later when gimplify_modify_expr encounters a corresponding error_mark_node as second argument of a MODIFY_EXPR. I believe we have a very general error recovery weakness with errors like unqualified_name_lookup_error and functions like cp_parser_initializer_list returning a vec: certainly we don't want to give up the parsing too early but then we have to cope with error_mark_nodes filtering down and reappearing much later in the compilation. The present bug is a rather clear example, but I have seen many others in the past: a couple of times I even tried doing something about it, but I have yet to figure out something worth sending to the mailing list. Anyway, here I'm wondering if at this stage it would make sense to handle the error_mark_node in gimplify_modify_expr - I believe we do have a couple other cases of such late handling in the gimplifier. Tested x86_64-linux.

Thanks, Paolo.

//////////////////////////////

2017-12-20  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/81055
        * gimplify.c (gimplify_modify_expr): When the second operand of
        the expression is error_mark_node immediately return GS_ERROR.

/testsuite
2017-12-20  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/81055
        * g++.dg/cpp0x/new2.C: New.
Index: gimplify.c
===================================================================
--- gimplify.c  (revision 255894)
+++ gimplify.c  (working copy)
@@ -5554,6 +5553,9 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pr
   gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR
              || TREE_CODE (*expr_p) == INIT_EXPR);
 
+  if (*from_p == error_mark_node)
+    return GS_ERROR;
+
   /* Trying to simplify a clobber using normal logic doesn't work,
      so handle it here.  */
   if (TREE_CLOBBER_P (*from_p))
Index: testsuite/g++.dg/cpp0x/new2.C
===================================================================
--- testsuite/g++.dg/cpp0x/new2.C       (nonexistent)
+++ testsuite/g++.dg/cpp0x/new2.C       (working copy)
@@ -0,0 +1,4 @@
+// PR c++/81055
+// { dg-do compile { target c++11 } }
+
+int** p = new int*[1]{q};  // { dg-error "not declared" }

Reply via email to