[cfe-dev] Cleaning up the representation of Decls in the AST
Chris Lattner
clattner at apple.com
Sat Aug 23 18:50:57 PDT 2008
On Aug 22, 2008, at 2:08 PM, Ted Kremenek wrote:
>
> (3) ScopedDecl CHAIN: CONFLATED IMPLEMENTATION AND LACK OF ABSTRACTION
> In generally, we believe that the ScopedDecl chain should just be
> removed. It is used in logically inconsistent ways and almost every
> client that has used it has gotten things wrong at least once.
This seems like a somewhat orthogonal problem from the rest.
> PROPOSED SOLUTION
>
> We propose the following solution to address these issues:
>
> - EnumDecl and NamespaceDecl no longer used the getNextDeclarator()
> chain in ScopedDecl. Both can use a chain (as they do now), or some
> alternate representation. However, the implementation chosen will be
> private to each class and an iterator interface should suffice to
> allow clients to ignore the details of the implementation.
I agree completely, since this is relatively orthogonal from the rest,
it can be done as a first step independent from DeclGroupization
>
> - Introduce the notion of "DeclGroup" that represents a group of
> (comma-separated) Decls.
>
> Essentially, DeclGroup would have the following grammar:
>
> DeclGroup -> TypeDecl Decl+
> -> Decl
According to the C grammar lexicon, "typedecl" is a "declaration
specifier" and "decl" is a "declarator".
> This also works for typedefs:
>
> typedef struct x {} foo, bar;
>
> becomes a DeclGroup consisting of:
>
> (1) A RecordDecl for 'struct x' (the "TypeDecl").
> (2) Two TypedefDecls for 'foo' and 'bar'.
>
> Note that this completely resolves the ownership issues with anonymous
> structs and similar constructs. It also means that Types no longer
> own Decls (a good thing).
Presumably this means that "typedef struct x foo, bar" would be a
DeclGroup with no "TypeDecl" but with two typedef decls?
> For the common case where a DeclGroup contains a single Decl (and no
> extra "TypeDecl" is needed), DeclGroup would have an optimized
> implementation so that using DeclGroup has no additional space
> overhead compared to our current implementation. Our idea is to
> essentially implement DeclGroup as a smart pointer, and for this
> common case it just contains the pointer to the solitary Decl (no
> additional overhead).
Ok.
> - RecordDecls would represent their fields as a group of DeclGroups.
> This enables us to accurately represent:
>
> struct x {
> struct y { int z; } a, b;
> int c;
> };
Ok. This fixes the inconsistency with how we represent struct fields
as well (right now we don't keep track that they are 'grouped').
> A field_iterator interface can provide the necessary abstraction to
> clients that just want to iterate over the FieldDecls of a struct.
That seems like it will be the common need for Sema at least, so that
would be very nice.
> PROS AND IMPLEMENTATION
I'm sold, totally awesome. Nice proposal guys.
Here's another related issue that isn't really addressed: who owns the
expressions for types?
typedef int X[1+2+x]; // vla
who owns the 1+2+x? We have an issue in the canonical type system
where "const X" will end up making another *type* which shares
ownership of the expression. This is badness, but perhaps an
unrelated issue to the rest of the declgroup discussion here.
-Chris
More information about the cfe-dev
mailing list