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" }