On Tue, Jan 21, 2025 at 12:04:36PM -0500, Jason Merrill wrote:
> > --- gcc/cp/parser.cc.jj     2025-01-17 19:27:34.052140136 +0100
> > +++ gcc/cp/parser.cc        2025-01-20 20:16:23.082876036 +0100
> > @@ -36632,14 +36632,22 @@ cp_parser_objc_message_args (cp_parser*
> >     /* Handle non-selector arguments, if any. */
> >     while (token->type == CPP_COMMA)
> >       {
> > -      tree arg;
> > -
> >         cp_lexer_consume_token (parser->lexer);
> > -      arg = cp_parser_assignment_expression (parser);
> > -      addl_args
> > -   = chainon (addl_args,
> > -              build_tree_list (NULL_TREE, arg));
> > +      if (cp_lexer_next_token_is (parser->lexer, CPP_EMBED))
> > +   {
> > +     tree raw_data = cp_lexer_peek_token (parser->lexer)->u.value;
> > +     cp_lexer_consume_token (parser->lexer);
> > +     for (tree argument : raw_data_range (raw_data))
> > +       addl_args = chainon (addl_args,
> > +                            build_tree_list (NULL_TREE, argument));
> 
> chainon of each byte of an #embed looks pretty inefficient, walking the full
> list for each new element.  But OK.

Indeed, I've just used what it was doing without thinking too much about it,
sorry.
addl_args = tree_cons (NULL_TREE, arg, addl_args);
with addl_args = nreverse (addl_args); after the loop might be better,
can test that incrementally.  sel_args is handled the same and should have
the same treatment.

        Jakub

Reply via email to