sammccall added a comment.

(while this is useful to you, let's keep discussing, but I'm also happy to stop 
and land this with your preferred API/semantics - just LMK if changes are 
needed)
In D89743#2360032 <https://reviews.llvm.org/D89743#2360032>, @aaron.ballman 
wrote:

> Thank you for giving this feedback, it's helpful! I may have to rethink this 
> a bit because it never dawned on me that someone would think of attributes 
> being more like a `DeclRefExpr` than a `NamedDecl`. If I'm following along 
> properly, this is because the AST node for the attribute could have been 
> generated from various ways of spelling it? e.g., `gcc::aligned` vs 
> `_Alignas` vs `align` vs `alignas` all making an `AlignedAttr`.

My mental model is that the Attr **classes** own the names, and the Attr 
**instances** refer to the classes using the names.

So the class `AlignedAttr` has the name `aligned`, and the instance 
`[[gnu::aligned(8)]]` refers to it. Just like the `FunctionDecl` `double 
sqrt(double);` has the name `sqrt`, and the DeclRefExpr in `sqrt(8)` refers to 
it.

To reinforce this, I can't choose a different name for the instance: 
`[[gnu::whatever]]` doesn't produce an Attr instance at all. But I can choose a 
different name for the class (by modifying Attr.td).
So an Attr instance (what we're matching) feels more like a reference than a 
primary entity. (Similarly, the **semantics** are associated with the Attr 
class rather than the instance).

If clang's AST modeled syntax rather than semantics, I imagine there'd be one 
`Attr` class and each instance could have an arbitrary name and arg list. In 
that case an Attr would seem to "have" a name in the same sense a decl does.

> I figured it would make more sense for `attr(hasName("aligned"))` to match 
> any `AlignedAttr` regardless of how the user wrote it in their source code, 
> but perhaps others have different ideas here.

That definitely seems like the common case. However I can certainly imagine 
wanting to e.g. write a migration from `__attribute__((xxx))` to `[[gnu::xxx]]`.

(If attr **classes** were AST nodes too, like DeclRefExpr/Decl or TypeLoc/Type 
then you'd resolve this by using a matcher on one or the other)

As it stands it seems too surprising that `Attr::getAttrName()` returns the 
particular name used for that instance, but `attr(hasAttrName("..."))` would 
match any name associated with the same class.
Maybe `attr(equivalentAttrName("..."))` or so, possibly constrasting to 
`attr(exactAttrName("..."))`?

> The scope handling is a bit of a question mark. Attributes don't really have 
> namespaces like other identifiers, but they sort of have them when you squint 
> at the name just right. For instance, the scope handling currently allows you 
> to match `::foo` in C mode even though C doesn't have the notion of 
> namespaces. So I thought it wouldn't be unintuitive for it to also work for 
> namespace scopes as well.

Yup, I don't have a real opinion here, I just assumed it was different. Seems 
like it would work fine.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D89743/new/

https://reviews.llvm.org/D89743

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to