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

Reply via email to