Message ID | f65ddcff-7cff-f41d-b3eb-20ca42daf5ce@oracle.com |
---|---|
State | New |
Headers | show |
Series | [C++] PR 87324 ("g++ ICE with overriding initializers: Segmentation fault") | expand |
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. > > //////////////////// >
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" }