[C++] PR 87324 ("g++ ICE with overriding initializers: Segmentation fault")

Message ID f65ddcff-7cff-f41d-b3eb-20ca42daf5ce@oracle.com
State New
Headers show
Series
  • [C++] PR 87324 ("g++ ICE with overriding initializers: Segmentation fault")
Related show

Commit Message

Paolo Carlini Sept. 19, 2018, 2:42 p.m.
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.carlini@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.carlini@oracle.com>

	PR c++/87324
	* g++.dg/cpp0x/desig5.C: New.

Comments

Jason Merrill Sept. 19, 2018, 4:02 p.m. | #1
OK.

On Wed, Sep 19, 2018 at 10:42 AM, Paolo Carlini
<paolo.carlini@oracle.com> wrote:
> 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.

>

> ////////////////////

>

Patch

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