Hi,
in this simple error-recovery issue we ICE in get_class_binding_direct
when we try to use IDENTIFIER_CONV_OP_P on the index which we nulled in
cp_parser_initializer_list. If, instead, we assign error_mark_node to it
we catch it later in reshape_init_class and error-recovery goes well.
Tested x86_64-linux.
Thanks, Paolo.
////////////////////
/cp
2018-09-19 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/87324
* parser.c (cp_parser_initializer_list): Assign error_mark_node
to the index upon error.
/testsuite
2018-09-19 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/87324
* g++.dg/cpp0x/desig5.C: New.
Index: cp/parser.c
===================================================================
--- cp/parser.c (revision 264419)
+++ cp/parser.c (working copy)
@@ -22394,7 +22394,7 @@ cp_parser_initializer_list (cp_parser* parser, boo
"%<.%s%> designator used multiple times in "
"the same initializer list",
IDENTIFIER_POINTER (designator));
- (*v)[i].index = NULL_TREE;
+ (*v)[i].index = error_mark_node;
}
else
IDENTIFIER_MARKED (designator) = 1;
Index: testsuite/g++.dg/cpp0x/desig5.C
===================================================================
--- testsuite/g++.dg/cpp0x/desig5.C (nonexistent)
+++ testsuite/g++.dg/cpp0x/desig5.C (working copy)
@@ -0,0 +1,13 @@
+// PR c++/87324
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wno-pedantic" }
+
+struct {
+ struct {
+ double a;
+ struct {
+ short b;
+ };
+ };
+ int c;
+} d{.a = 7, .a = 8.09}; // { dg-error "designator used multiple times in the
same initializer list" }