[cfe-dev] ParamDecls missing from function DeclContext
richard at metafoo.co.uk
Mon May 21 11:46:59 PDT 2012
On Mon, May 21, 2012 at 11:03 AM, Douglas Gregor <dgregor at apple.com> wrote:
> On May 16, 2012, at 10:49 AM, Abramo Bagnara <abramo.bagnara at gmail.com>
> > Il 16/05/2012 17:57, Douglas Gregor ha scritto:
> >>>>> 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
> >>>>> 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,
> >>> 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
> >>> 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"...)
> >> The C(++) languages don't actually place such declarations in any
> >> particular context, so it's not clear where they belong in the AST.
> >> Introducing some kind of abstract function declaration that is the
> >> DeclContext might conceivably work, but that's a rather heavyweight
> >> solution just to maintain an invariant. Using FunctionTypeLoc doesn't
> >> really work, because DeclContexts are supposed to be Decls.
> > Just to be clear, I was not thinking to transform FunctionTypeLoc in a
> > DeclContext, but to put a DeclContext* in FunctionTypeLoc data.
> > This pointer points to FunctionDecl itself when the FunctionTypeLoc is
> > the type of a FunctionDecl, otherwise it points to a specific class
> > derived from DeclContext (FunctionTypeDeclContext?) that contains only
> > the ParmVarDecl's.
> In the FunctionDecl case, we don't actually need this pointer because it
> is available in the ParmVarDecls. Can we optimize it away?
> >> Personally, I'm fine with having parameters in the lexical
> >> DeclContext of the translation unit for this case, but we can
> investigate other designs.
> > How you would skip them?
> > What about template instantiation of these? Everything would be added to
> > TranslationUnit?
> I guess so.
> > Perhaps I'm the only to feel this way, but to add Decls to contexts
> > where they don't belong sincerely appears like a little mess to me...
> I agree that it feels a little messy, but we're discussing increasing
> Clang's memory footprint to meet an invariant that we've never needed
> before. Make it cheap or make it important and it becomes obvious that it's
> worth doing.
It's not completely clear to me what invariant a FunctionTypeDeclContext
would help with. It seems to be attempting to make the DeclContext
structure reflect the unqualified name lookup rules? We are far from that
being an invariant (for instance, at block scope, or when a tag type is
declared within a declarator). For instance, if we visit this TU:
typedef void f(struct S);
... we visit a 'struct S;' declaration within the TU, before we visit the
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the cfe-dev