[cfe-dev] Decls are not synonyms for the symbols they represent

Argiris Kirtzidis akyrtzi at gmail.com
Tue Sep 16 18:27:36 PDT 2008


Hi Ted,

Ted Kremenek wrote:
> (example 2)
>
>   struct s;
>   struct s { int a; };
>   struct s;
>
> Until a few weeks ago, these struct declarations were represented by a 
> single RecordDecl with a unique RecordType.  Now they are represented 
> by three separate RecordDecls with a shared, unique RecordType.

What do you think about the idea of going back to single RecordDecls and 
using DeclGroups to represent the above example ?

struct s; -> typespecifier ';' -> DeclGroup with TypeSpecifier 
referencing 's' and empty declaration list
struct s { int a; }; -> typespecifier ';' -> DeclGroup with 
TypeSpecifier defining 's' and empty declaration list

And only one RecordDecl will be created for 's'.

Or maybe make it more explicit by introducing a TypeSpecDecl for these 
constructs.

>
> (example 3)
>
> int f();
> int f();
> int f() { return 0; }
>
> int g();
> int g() { return 1; }
>
> For this example, we have separate FunctionDecls for each one of these 
> declarations.  In this example, all of the declarations both 'f' and 
> 'g' share the same type (note that this is different from the case 
> with structs).  For the case of 'f', all of its FunctionDecls are 
> chained together, and the same goes for 'g'.  There is, however, no 
> notion of an entity or concept in the ASTs or other clang data 
> structures that represent 'f' itself.
>
> Here is an example of why not having an explicit concept for 'f', 'g', 
> or any symbol is problematic.
>
> 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.
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

-Argiris

>  Given one of these FunctionDecls, I would have to iterate the chain 
> of FunctionDecls and query each one of its attributes.  This seems a 
> little cumbersome, and causes separate clients to have to implement 
> their own logic for querying information about "symbols" in a 
> translation unit.  It also causes clients to think about internal 
> representations such as the fact that FunctionDecls are chained, 
> something we may wish to change at any moment in the future.
>
> This email isn't really a proposal of a solution; I'm just raising an 
> issue to see if anyone has any comments.  After the last few weeks 
> I've been excited by our discussions of DeclGroups and TypeSpecifiers 
> that will solve many of the remaining issues with faithfully 
> representing syntax in the ASTs.  At the same time, I think we need to 
> pay a little more attention to the semantics, and providing 
> infrastructure that would be useful for many clients.
>
> Indeed, some of our changes to improve our capturing of syntax have 
> actually weakened some of our clients reasoning about semantics.  For 
> example, by splitting separate struct declarations into multiple 
> RecordDecls we actually (initally) broke CodeGen because the CodeGen 
> library assumed that there was a direct 1-1 mapping between a 
> RecordDecl and the concept it represented.  That particular case was 
> easily resolved by using the RecordType instead of the RecordDecl to 
> represent the 'struct', but I'd be willing to wager that there are 
> other issues that haven't surfaced yet because RecordTypes are being 
> used in this way (by all clients).
>
> Thoughts?
> ------------------------------------------------------------------------
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>   



More information about the cfe-dev mailing list