On Thu, Jul 18, 2024 at 03:11:56PM -0700, Andi Kleen wrote:
> On Thu, Jul 18, 2024 at 02:19:21PM -0400, Marek Polacek wrote:
> > On Wed, Jul 17, 2024 at 09:30:00PM -0700, Andi Kleen wrote:
> > > Implement a C23 clang compatible musttail attribute similar to the earlier
> > > C++ implementation in the C parser.
> > >
> > > gcc/c/ChangeLog:
> > >
> > > PR c/83324
> > > * c-parser.cc (struct attr_state): Define with musttail_p.
> > > (c_parser_statement_after_labels): Handle [[musttail]].
> > > (c_parser_std_attribute): Dito.
> > > (c_parser_handle_musttail): Dito.
> > > (c_parser_compound_statement_nostart): Dito.
> > > (c_parser_all_labels): Dito.
> > > (c_parser_statement): Dito.
> > > * c-tree.h (c_finish_return): Add musttail_p flag.
> > > * c-typeck.cc (c_finish_return): Handle musttail_p flag.
> > > ---
> > > gcc/c/c-parser.cc | 70 ++++++++++++++++++++++++++++++++++++++---------
> > > gcc/c/c-tree.h | 2 +-
> > > gcc/c/c-typeck.cc | 7 +++--
> > > 3 files changed, 63 insertions(+), 16 deletions(-)
> > >
> > > diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
> > > index 12c5ed5d92c7..a8848d01f21a 100644
> > > --- a/gcc/c/c-parser.cc
> > > +++ b/gcc/c/c-parser.cc
> > > @@ -1621,6 +1621,12 @@ struct omp_for_parse_data {
> > > bool fail : 1;
> > > };
> > >
> > > +struct attr_state
> > > +{
> > > + /* True if we parsed a musttail attribute for return. */
> > > + bool musttail_p;
> > > +};
> > > +
> > > static bool c_parser_nth_token_starts_std_attributes (c_parser *,
> > > unsigned int);
> > > static tree c_parser_std_attribute_specifier_sequence (c_parser *);
> > > @@ -1665,7 +1671,7 @@ static location_t
> > > c_parser_compound_statement_nostart (c_parser *);
> > > static void c_parser_label (c_parser *, tree);
> > > static void c_parser_statement (c_parser *, bool *, location_t * = NULL);
> > > static void c_parser_statement_after_labels (c_parser *, bool *,
> > > - vec<tree> * = NULL);
> > > + vec<tree> * = NULL, attr_state =
> > > {});
> >
> > Nit: the line seems to go over 80 columns.
>
> Ok.
>
> > > || c_parser_next_token_is_keyword (parser, RID_DEFAULT)
> > > || (c_parser_next_token_is (parser, CPP_NAME)
> > > @@ -7346,7 +7384,10 @@ c_parser_all_labels (c_parser *parser)
> > > std_attrs = NULL;
> > > if ((have_std_attrs = c_parser_nth_token_starts_std_attributes
> > > (parser,
> > > 1)))
> > > - std_attrs = c_parser_std_attribute_specifier_sequence (parser);
> > > + {
> > > + std_attrs = c_parser_std_attribute_specifier_sequence (parser);
> > > + std_attrs = c_parser_handle_musttail (parser, std_attrs, attr);
> > > + }
> >
> > Thanks, I believe this addresses the testcase I mentioned earlier:
> >
> > struct str
> > {
> > int a, b;
> > };
> >
> > struct str
> > cstruct (int x)
> > {
> > if (x < 10)
> > L: // <====
> > [[gnu::musttail]] return cstruct (x + 1);
> > return ((struct str){ x, 0 });
> > }
> >
> > but I didn't see that being tested in your testsuite patch; apologies if
> > I missed it.
>
> It wasn't there. I will add it.
>
> >
> > > tree
> > > -c_finish_return (location_t loc, tree retval, tree origtype)
> > > +c_finish_return (location_t loc, tree retval, tree origtype, bool
> > > musttail_p)
> > > {
> > > tree valtype = TREE_TYPE (TREE_TYPE (current_function_decl)), ret_stmt;
> > > bool no_warning = false;
> > > @@ -11742,6 +11743,8 @@ c_finish_return (location_t loc, tree retval,
> > > tree origtype)
> > > warning_at (xloc, 0,
> > > "function declared %<noreturn%> has a %<return%> statement");
> > >
> > > + set_musttail_on_return (retval, xloc, musttail_p);
> > > +
> > > if (retval)
> > > {
> > > tree semantic_type = NULL_TREE;
> >
> > Is it deliberate that set_musttail_on_return is called outside the
> > if (retval) block? If it can be moved into it, set_musttail_on_return
> > can be simplified to assume that retval is always non-null.
>
> Yes it can be removed.
>
> Is the patchk ok with these changes?
Yes, thanks.
Marek