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

Reply via email to