OK.
On Tue, Feb 21, 2017 at 12:11 PM, Marek Polacek <pola...@redhat.com> wrote: > Jason suggested that the way forward with this PR, where we ICE because we > have > a default mem-initializer for a flexible array, and verify_ctor_sanity crashes > on that, is to reject such code. This patch attempts to do that; I'm not > entirely happy about the placement of the maybe_reject_flexarray_init call, > but it probably couldn't be in digest_nsdmi_init, becase that could result > in multiple error messages for the same thing. > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > 2017-02-21 Marek Polacek <pola...@redhat.com> > > PR c++/79535 > * cp-tree.h (maybe_reject_flexarray_init): Declare. > * init.c (maybe_reject_flexarray_init): No longer static. > Add check for current_function_decl. > * parser.c (cp_parser_late_parse_one_default_arg): Reject > a default mem-initializer for a flexible array. > > * g++.dg/ext/flexary23.C: New test. > > diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h > index 6675ee5..f53f744 100644 > --- gcc/cp/cp-tree.h > +++ gcc/cp/cp-tree.h > @@ -6069,6 +6069,7 @@ extern tree scalar_constant_value (tree); > extern tree decl_really_constant_value (tree); > extern int diagnose_uninitialized_cst_or_ref_member (tree, bool, bool); > extern tree build_vtbl_address (tree); > +extern bool maybe_reject_flexarray_init (tree, tree); > > /* in lex.c */ > extern void cxx_dup_lang_specific_decl (tree); > diff --git gcc/cp/init.c gcc/cp/init.c > index fa74226..13ade8a 100644 > --- gcc/cp/init.c > +++ gcc/cp/init.c > @@ -600,7 +600,7 @@ get_nsdmi (tree member, bool in_ctor) > /* Diagnose the flexible array MEMBER if its INITializer is non-null > and return true if so. Otherwise return false. */ > > -static bool > +bool > maybe_reject_flexarray_init (tree member, tree init) > { > tree type = TREE_TYPE (member); > @@ -615,6 +615,7 @@ maybe_reject_flexarray_init (tree member, tree init) > initializer list. */ > location_t loc; > if (DECL_INITIAL (member) == init > + || !current_function_decl > || DECL_DEFAULTED_FN (current_function_decl)) > loc = DECL_SOURCE_LOCATION (member); > else > diff --git gcc/cp/parser.c gcc/cp/parser.c > index 0146596..15e09f7 100644 > --- gcc/cp/parser.c > +++ gcc/cp/parser.c > @@ -27228,6 +27228,8 @@ cp_parser_late_parse_one_default_arg (cp_parser > *parser, tree decl, > if (TREE_CODE (decl) == PARM_DECL) > parsed_arg = check_default_argument (parmtype, parsed_arg, > tf_warning_or_error); > + else if (maybe_reject_flexarray_init (decl, parsed_arg)) > + parsed_arg = error_mark_node; > else > parsed_arg = digest_nsdmi_init (decl, parsed_arg); > } > diff --git gcc/testsuite/g++.dg/ext/flexary23.C > gcc/testsuite/g++.dg/ext/flexary23.C > index e69de29..099e7fd 100644 > --- gcc/testsuite/g++.dg/ext/flexary23.C > +++ gcc/testsuite/g++.dg/ext/flexary23.C > @@ -0,0 +1,11 @@ > +// PR c++/79535 - ICE with NSDMI and array > +// { dg-do compile { target c++14 } } > +// { dg-options -Wno-pedantic } > + > +struct A > +{ > + int b = 1; > + int c = 2; > + int x[] = { c, 3 }; // { dg-error "initializer for flexible array member" } > +}; > +A a = { 4, 5 }; > > Marek