On Fri, May 31, 2019 at 9:48 PM Jeff Law <l...@redhat.com> wrote:
>
> On 1/11/19 1:10 PM, Martin Sebor wrote:
> > The attached patch extends the detection of references to static
> > variables in inline functions to the function signatures, including
> > their return type.  Since the declaration of a function need not be
> > yet available at the time the static is referenced (e.g., when it's
> > referenced in the functions return type), the patch introduces
> > the concept of "tentative records" of such references and either
> > completes the records when the full declaration of the function,
> > including its definition, is known to be inline, or removes it
> > when it isn't.
> >
> > Martin
> >
> > gcc-88718.diff
> >
> > PR c/88718 - Strange inconsistency between old style and new style 
> > definitions of inline functions.
> >
> > gcc/c/ChangeLog:
> >
> >       PR c/88718
> >       * c-decl.c (reset_inline_statics): New function.
> >       (record_inline_static): Optimize.
> >       (check_inline_statics): Handle tentative records for inline
> >       declarations without definitions.
> >       Print static declaration location.
> >       (push_file_scope): Clear records of references to statics.
> >       (finish_decl): Add tentative records of references to statics.
> >       (finish_function): Same.
> >       * c-typeck.c (build_external_ref): Handle all references to statics.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       PR c/88718
> >       * gcc.dg/inline-40.c: New test.
> >       * gcc.dg/inline-41.c: New test.
> >
> > Index: gcc/c/c-decl.c
> > ===================================================================
> > --- gcc/c/c-decl.c    (revision 267616)
> > +++ gcc/c/c-decl.c    (working copy)
> > @@ -826,14 +826,47 @@ c_finish_incomplete_decl (tree decl)
> >      }
> >  }
> >
> > -/* Record that inline function FUNC contains a reference (location
> > -   LOC) to static DECL (file-scope or function-local according to
> > -   TYPE).  */
> > +/* Free records of references to static variables gathered so far.  */
> >
> > +static void
> > +reset_inline_statics (void)
> > +{
> > +  if (!c_inline_statics)
> > +    return;
> > +
> > +  for (c_inline_static *csi = c_inline_statics, *next = csi->next;
> > +       csi; csi = next)
> > +    ggc_free (csi);
> > +
> > +  c_inline_statics = NULL;
> > +}
> > +
> > +/* Record that inline function FUNC either does contain or may contain
> > +   a reference (location LOC) to static DECL (file-scope or function-local
> > +   according to TYPE).  For a null FUNC, a tentative record is created that
> > +   reflects a reference in the function signature and that is either 
> > updated
> > +   or removed when the function declaration is complete.  */
> > +
> >  void
> >  record_inline_static (location_t loc, tree func, tree decl,
> >                     enum c_inline_static_type type)
> >  {
> > +  gcc_assert (decl);
> > +
> > +  if (c_inline_statics)
> > +    {
> > +      /* Avoid adding another tentative record for this DECL if one
> > +      already exists.  */
> > +      for (c_inline_static *csi = c_inline_statics; csi; csi = csi->next)
> > +     {
> > +       if (c_inline_statics->function)
> > +         break;
> > +
> > +       if (decl == c_inline_statics->static_decl)
> > +         return;
> > +     }
> > +    }
> > +
> I'm going to assume this isn't called enough for the linear search to
> matter from a compile-time standpoint.

Err - but there must be a better way, no?  It's trivial to write a testcase
running into quadratic behavior here.

Richard.

>
> OK for the trunk.
>
> Jeff

Reply via email to