[cfe-dev] Decls are not synonyms for the symbols they represent
steve naroff
snaroff at apple.com
Tue Sep 16 15:30:58 PDT 2008
Ted,
I couldn't get clang to crash on the code you referenced below...
[steve-naroffs-imac-2:llvm/tools/clang] snaroff% cat xx.c
void f (void)
{
extern double *p;
extern double *p;
}
[steve-naroffs-imac-2:llvm/tools/clang] snaroff% ../../Debug/bin/clang
xx.c
xx.c:4:18: error: redefinition of 'p'
extern double *p;
^
xx.c:3:18: error: previous definition is here
extern double *p;
^
2 diagnostics generated.
Do I need to run clang with any special switches?
snaroff
On Sep 16, 2008, at 5:41 PM, Ted Kremenek wrote:
> A few weeks ago I had a conversation with Daniel about the fact that
> the ASTs (or other clang data structures) have no notion of the
> "entity" (for lack of a better word) that a declaration represents.
>
> Here are a couple examples of what I mean:
>
> (example 1)
>
> extern double x;
> extern double x;
>
> Both of these are variable declarations that reference the same
> variable. There is no notion of the variable itself other than the
> declarations, which is conflated, particularly since we have
> multiple declarations in this case (i.e., there is no unique
> "entity" for the variable).
>
> (incidentally, clang crashes on this input: http://llvm.org/bugs/show_bug.cgi?id=2760)
>
>
> (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.
>
> With structures, the unique RecordType indeed can be treated as
> representing the "struct" itself, which seems fine since the given
> declarations are just type declarations. So in this case, we *do*
> have a unique "entity" in the ASTs to represent what the
> declarations refer to. There are still some issues with this
> representation, but I will delay mentioning them until after the
> next example.
>
>
> (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? 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080916/52bf4b4e/attachment.html>
More information about the cfe-dev
mailing list