[cfe-dev] Decls are not synonyms for the symbols they represent
Ted Kremenek
kremenek at apple.com
Tue Sep 16 20:40:01 PDT 2008
On Sep 16, 2008, at 6:27 PM, Argiris Kirtzidis wrote:
>> Consider:
>>
>> extern int h(int* x) __attribute__((nonnull)); extern int h(int
>> *x);
>> extern int h(int* x) __attribute__((noreturn));
>> This code is completely valid. In the ASTs we create three
>> FunctionDecls, the first having the attribute "nonnull" attached to
>> it (and object of type NonNullAttr) and the third having the
>> attribute "noreturn" attached to it (an object of type NoReturnAttr).
>>
>> Suppose I had a client (e.g., code generation, static analysis)
>> that wanted to know all the attributes attached to a given
>> function. How would I go about doing this?
>
> If I'm not mistaken, the latest declaration is supposed to "merge"
> the information from all previous declarations through
> Sema::MergeFunctionDecl, and that includes attributes.
To my chagrin I was not aware of this. Thanks for pointing it out!
The problem I have with this approach is that it relies on the ASTs
being constructed in a very special way. Sema of course has to do the
right thing, but what about other entities that create or modify
ASTs? Put another way, it is not clear to me, from looking at the
ASTs, that the invariant you mentioned is in place. It's just
something that is silently there because of the way Sema does things.
>
> The client would only need to query information from the latest
> declaration.
>
> FYI, there was a long-winded discussion on what is a good way to
> combine the information from all FunctionDecls and use the same
> FunctionDecl pointer throughout the AST, here:
> http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-April/001479.html
> http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-May/001608.html
>
My own feeling, and from reviewing the threads you mentioned and from
looking over the recent discussions on this list, that reusing Decls
(either by merging them, changing SourceLocations, etc.) just doesn't
seem right. Gradually mutating the Decl objects as we construct the
rest of the AST for a translation unit just seems messy, and makes
modifying or creating AST nodes error prone. Reusing Decls to me
makes it inherently harder to capture the way a user wrote the code.
I'm willing to put this part of the argument, however, until we have
actually gone and implemented some of TypeSpecifier and DeclGroup to
see what we are left with.
To me declarations represent syntax, and should reference the thing
they are declaring. RecordDecls already do this with RecordTypes
(since there is a many-to-one mapping here), but we don't have a
similar concept for variables and functions.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080916/c63a7dab/attachment.html>
More information about the cfe-dev
mailing list