On 5/18/20 5:07 PM, Marek Polacek wrote:
On Mon, May 18, 2020 at 04:50:44PM -0400, Jason Merrill via Gcc-patches wrote:
On 5/13/20 12:22 PM, Marek Polacek wrote:
DR 2289 clarified that since structured bindings have no C compatibility
implications, they should be unique in their declarative region, see
[basic.scope.declarative]/4.2.

The duplicate_decls hunk is the gist of the patch, but that alone would
not be enough to detect the 'A' case: cp_parser_decomposition_declaration
uses

13968       tree decl2 = start_decl (declarator, &decl_specs, SD_INITIALIZED,
13969                                NULL_TREE, NULL_TREE, &elt_pushed_scope);

to create the 'A' VAR_DECL but in this start_decl's grokdeclarator we
don't do fit_decomposition_lang_decl because the declarator kind is not
cdk_decomp

Why isn't it?  I see

   cp_declarator *declarator = make_declarator (cdk_decomp);

a few lines up.

Right, and we use that for the underlying decomp base VAR_DECL.  But each of
the named variables used in a structured binding are created in the
FOR_EACH_VEC_ELT loop, and that creates a cdk_id declarator for them:

13963       if (i == 0)
13964         declarator = make_id_declarator (NULL_TREE, e.get_value (),
13965                                          sfk_none, e.get_location ());

Ah, yes.

You name the new parameter FORCE_LANG_DECL_P and describe it as meaning "create a lang decl node for the new decl", but the actual meaning seems to be "mark the new decl as DECL_DECOMPOSITION_P", which seems too specific for adding a new parameter to a frequently used function.

How about adding a new SD_DECOMPOSITION value for the initialized parameter, or an attribute?

Jason

Reply via email to