Decls and Attrs

Hi!
   Maybe a silly question but can two Decls be annotated with the same Attr pointer in the AST? Said differently why there is no clang::Attr::getDecl()
   Thanks!
Vassil

Yes, you can do it -- you can call Decl::addAttr to add the attributes
to the declaration, and then use Decl::specific_attr_begin and
Decl::specific_attr_end to iterate over the attributes of a specific
kind on the declaration.

Take a look at getVisibilityOf where it attempts to get the
AvailabilityAttrs on a Decl if you'd like an example.

~Aaron

Hi Aaron,
   Maybe I misundertand. My question is actually the inverse. Given that I have an attribute can I find which decl it is attached to?
Vassil

Ah, no, I misunderstood your question. Sorry about that!

And no, there is no direct link from an attribute back to a decl. For
instance, the attribute could be attached to a type or a stmt, as well
as a decl.

However, the Decl does not own its Attrs; the ASTContext does. So you
could modify the ASTContext to tell you which Decls an Attr is
attached to if you only care about Decls.

~Aaron

Ah, no, I misunderstood your question. Sorry about that!

No problem.

And no, there is no direct link from an attribute back to a decl. For
instance, the attribute could be attached to a type or a stmt, as well
as a decl.

IIUC, the policy is clang should/will generate just one attribute of a kind and this attribute will be reused, even though now the implementation seems doing it otherwise:
grep -rni "new ([a-zA-Z].*) [a-zA-Z].*Attr(" clang/lib/ ...

However, the Decl does not own its Attrs; the ASTContext does. So you
could modify the ASTContext to tell you which Decls an Attr is
attached to if you only care about Decls.

How I can do that? The only way that comes to my mind is iterating over all decls and asking for their attr...
Vassil

Ah, no, I misunderstood your question. Sorry about that!

No problem.

And no, there is no direct link from an attribute back to a decl. For
instance, the attribute could be attached to a type or a stmt, as well
as a decl.

IIUC, the policy is clang should/will generate just one attribute of a kind
and this attribute will be reused, even though now the implementation seems
doing it otherwise:
grep -rni "new ([a-zA-Z].*) [a-zA-Z].*Attr(" clang/lib/ ...

No, clang will generate a new attribute each time one is processed in
SemaDeclAttr.cpp, et al (it doesn't memoize attributes), but by
convention this attribute is only attached to a single subject at a
time.

However, the Decl does not own its Attrs; the ASTContext does. So you
could modify the ASTContext to tell you which Decls an Attr is
attached to if you only care about Decls.

How I can do that? The only way that comes to my mind is iterating over all
decls and asking for their attr...

Since ASTContext holds onto the list of attributes (and not the decl
itself), you can walk the list the AST is holding via
ASTContext::DeclAttrs. So you would not have to walk all Decls, just
Decls that have Attrs.

~Aaron