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