[cfe-dev] ParamDecls missing from function DeclContext

Abramo Bagnara abramo.bagnara at gmail.com
Wed May 16 02:23:26 PDT 2012


Il 16/05/2012 07:11, Douglas Gregor ha scritto:
> 
> On May 15, 2012, at 4:59 PM, Richard Smith wrote:
> 
>> On Tue, May 15, 2012 at 10:55 AM, Douglas Gregor <dgregor at apple.com
>> <mailto:dgregor at apple.com>> wrote:
>>
>>
>>     On May 15, 2012, at 8:04 AM, Abramo Bagnara
>>     <abramo.bagnara at gmail.com <mailto:abramo.bagnara at gmail.com>> wrote:
>>
>>     > Il 15/05/2012 16:36, Douglas Gregor ha scritto:
>>     >>
>>     >> On May 15, 2012, at 12:40 AM, Abramo Bagnara wrote:
>>     >>
>>     >>> Another much related issue is shown by the following:
>>     >>>
>>     >>> void sort(int (*compare)(int x, int y), int* x);
>>     >>>
>>     >>> Which should be the correct context of ParmVarDecl's inside
>>     >>> FunctionType (i.e. int x and int y)?
>>     >>
>>     >>
>>     >> The DeclContext notion breaks down a little bit here, because we
>>     >> don't create a context for FunctionTypes (and shouldn't). I'd
>>     rather
>>     >> that the inner ParmVarDecls be in the 'sort's FunctionDecl.
>>     >
>>     > Also if I don't have any problem with this I'd like to
>>     understand why
>>     > you think that FunctionTypeLoc should not have a pointer to a
>>     > DeclContext where the args are registered (that for FunctionDecl
>>     > function type is the very same FunctionDecl).
>>
>>     I'd rather not spend any storage on a DeclContext* in the
>>     FunctionTypeLoc.
>>
>>     > Apart this issue we have added to our AST visitors an experimental
>>     > assertion to verify that if the DeclContext for declaration D is DC,
>>     > then the DeclContext DC indeed contains declaration D.
>>     >
>>     > We get tons of assertion failures (e.g. for FunctionDecl or
>>     > CXXRecordDecl inside a template declaration).
>>     >
>>     > We'd like to understand if this is unexpected (and in general we
>>     should
>>     > always have that if D points to DC then DC should contains D) or
>>     if we
>>     > are equivocating the overall design of DeclContext's.
>>
>>
>>     For non-function, non-block DeclContext, this is an important
>>     invariant.
>>
>>     For function and block contexts, it doesn't matter: all of the
>>     declarations will be reachable via other means, because they are
>>     part of the declaration or one of the statements in the
>>     definition. If we're to do any work in the area of DeclContext for
>>     functions and blocks, I would much rather make them simpler---by
>>     eliminating both the lookup tables and the list of lexical
>>     declarations---and save the storage, rather than making them meet
>>     an invariant that doesn't seem to have any benefits.
>>
>>
>> The lookup tables for functions were removed by the work which Nick
>> and I did on DeclContext name lookup in March, except for local
>> function declarations, which don't seem to use the Scope mechanism for
>> name lookup. We didn't dig deeply into that issue at the time, but it
>> would need to be fixed before we could abandon the lexical decl chains
>> for functions entirely.
> 
> Local function declarations definitely need fixing. IIRC, they still
> have the wrong semantic declaration context (as do local extern
> variables). And if we fix them, we can refactor just a little to kill
> off that LookupPtr in FunctionDecl's DeclContext (e.g., by splitting
> DeclContext into DeclContext and SearchableDeclContext).
> 
>> That said, the invariant that the decls list on a DeclContext is
>> exactly the list of Decls which have that DC as their lexical context
>> would be useful. In particular, it could be useful for some clients to
>> guarantee that traversing Decls by recursively iterating all lexical
>> decls in all DCs would, in fact, reach all Decls.
> 
> Okay, I agree that this is a useful general invariant.

Everything is very nice in this way and we'd love to do in this way, but
this contrasts with

>> Abramo wrote:
>> Also if I don't have any problem with this I'd like to understand why
>> you think that FunctionTypeLoc should not have a pointer to a
>> DeclContext where the args are registered (that for FunctionDecl
>> function type is the very same FunctionDecl).

> Doug answer:
> I'd rather not spend any storage on a DeclContext* in the FunctionTypeLoc.

Suppose we have:
typedef int f(int x);

We should assign to int x a lexical DeclContext, suppose we choose to
assign it to the TranslationUnit... then to satisfy the invariant above
we should insert the ParmVarDecl in the TranslationUnit.

I really doubt this is sane choice... what happens to all visitors of
DeclContext when they encounter these ParmVarDecl (that I'd say are
definitely "misplaced"...)









More information about the cfe-dev mailing list