On Wed, Mar 14, 2018 at 08:44:48PM -0400, Jason Merrill wrote:
> > --- gcc/cp/decl.c.jj    2018-03-14 09:44:55.744974946 +0100
> > +++ gcc/cp/decl.c       2018-03-14 12:18:08.094012453 +0100
> > @@ -10448,7 +10448,7 @@ grokdeclarator (const cp_declarator *dec
> >       suppress reports of deprecated items.  */
> >    if (type && TREE_DEPRECATED (type)
> >        && deprecated_state != DEPRECATED_SUPPRESS)
> > -    warn_deprecated_use (type, NULL_TREE);
> > +    cp_warn_deprecated_use (type);
> >    if (type && TREE_CODE (type) == TYPE_DECL)
> >      {
> >        typedef_decl = type;
> > @@ -10456,7 +10456,7 @@ grokdeclarator (const cp_declarator *dec
> >        if (TREE_DEPRECATED (type)
> >           && DECL_ARTIFICIAL (typedef_decl)
> >           && deprecated_state != DEPRECATED_SUPPRESS)
> > -       warn_deprecated_use (type, NULL_TREE);
> > +       cp_warn_deprecated_use (type);
> >      }
> >    /* No type at all: default to `int', and set DEFAULTED_INT
> >       because it was not a user-defined typedef.  */
> > @@ -11271,8 +11271,18 @@ grokdeclarator (const cp_declarator *dec
> >                   explicitp = 2;
> >               }
> >
> > -           arg_types = grokparms (declarator->u.function.parameters,
> > -                                  &parms);
> > +           tree pushed_scope = NULL_TREE;
> > +           if (funcdecl_p
> > +               && decl_context != FIELD
> > +               && inner_declarator->u.id.qualifying_scope
> > +               && CLASS_TYPE_P (inner_declarator->u.id.qualifying_scope))
> > +             pushed_scope
> > +               = push_scope (inner_declarator->u.id.qualifying_scope);
> 
> Can't we use ctype here?

Inside of classes ctype is non-NULL, but we don't need to push anything,
current_class_type is already the class we care about.
That's the
  tree ctype = current_class_type;
on line 10130.  Then we have this
  for (id_declarator = declarator;
       id_declarator;
       id_declarator = id_declarator->declarator)
loop, where for cdk_id at line 10242 it tweaks ctype:
                else if (TYPE_P (qualifying_scope))
                  {
                    ctype = qualifying_scope;
                    if (!MAYBE_CLASS_TYPE_P (ctype))
                      {
                        error ("%q#T is not a class or a namespace", ctype);
                        ctype = NULL_TREE;
                      }
and indeed for the cases I care about (out of class method definitions)
ctype is set to non-NULL here.  But then at line 10542 it is cleared again:
  ctype = NULL_TREE;

and at 11176:
            if (ctype == NULL_TREE
                && decl_context == FIELD
                && funcdecl_p
                && friendp == 0)
              ctype = current_class_type;
set only for selected in-class definitions, and then tested and used a couple of
times.  And that is the state we call grokparms with.
Only later at line 11529 it is set again:
  if (declarator
      && declarator->kind == cdk_id
      && declarator->u.id.qualifying_scope
      && MAYBE_CLASS_TYPE_P (declarator->u.id.qualifying_scope))
    {
      ctype = declarator->u.id.qualifying_scope;
      ctype = TYPE_MAIN_VARIANT (ctype);
So, if I were to use some variable without really changing the behavior of
the grokdeclarator massively, it would need to be a copy of ctype saved into
another variable (how it should be named?) above line 10542.  Given the
TYPE_MAIN_VARIANT, I guess we should be using TYPE_MAIN_VARIANT somewhere
too.

        Jakub

Reply via email to