aaron.ballman added inline comments.

================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2733
+/// \endcode
+AST_MATCHER_P(AttributedStmt, isAttr, attr::Kind, AttrKind) {
+  return llvm::any_of(Node.getAttrs(),
----------------
ajohnson-uoregon wrote:
> aaron.ballman wrote:
> > sammccall wrote:
> > > This definitely seems more like `hasAttr` than `isAttr` to me. An 
> > > AttributedStmt *is* the (sugar) statement, and *has* the attribute(s).
> > > 
> > > Maybe rather `describesAttr` so people don't confuse this for one that 
> > > walks up, though?
> > Good point on the `isAttr` name!
> > 
> > I'm not sure `describeAttr` works (the statement doesn't describe 
> > attributes, it... has/contains/uses the attribute). Maybe.. 
> > `specifiesAttr()`?
> > 
> > Or are we making this harder than it needs to be and we should use 
> > `hasAttr()` for parity with other things that have attributes associated 
> > with them?
> Yeah I wasn't sure on the name, I just picked something that wouldn't make me 
> figure out polymorphic matcher declarations because this was the first AST 
> matcher I'd written. :)  
> 
> I like `containsAttr()` or `specifiesAttr()`, since it could have multiple 
> attributes. `hasAttr()` makes the most sense to me though. If y'all think we 
> should go with that, the new `hasAttr()` definition would look something like 
> this, right? (To make sure I do in fact understand polymorphic matchers.)
> 
> 
> ```
> AST_POLYMORPHIC_MATCHER_P(
>     hasAttr,
>     AST_POLYMORPHIC_SUPPORTED_TYPES(Decl, AttributedStmt),
>     attr::Kind, AttrKind) {
>   return llvm::any_of(Node.getAttrs(),
>                       [&](const Attr *A) { return A->getKind() == AttrKind; 
> });
> }
> ```
> 
> Original `hasAttr()` for reference:
> ```
> AST_MATCHER_P(Decl, hasAttr, attr::Kind, AttrKind) {
>   for (const auto *Attr : Node.attrs()) {
>     if (Attr->getKind() == AttrKind)
>       return true;
>   }
>   return false;
> }
> ```
> I like `containsAttr()` or `specifiesAttr()`, since it could have multiple 
> attributes. 

The same is true for declarations; they can have multiple attributes. Which is 
an interesting test case for us to add for statements:
```
int foo();

int main() {
  [[clang::nomerge]] [[likely]] return foo();
}
```
We should verify we can find both of those attributes on the same 
`attributedStmt()` (e.g., you don't have to do something like 
`attributedStmt(attributedStmt(...))` to match.)

As for the name, I think `hasAttr()` is fine; if it causes awkwardness in the 
future when we change the AST in Clang, we'll have to fix it up then, but that 
awkwardness will already be there for `attributedStmt()` itself.

> hasAttr() makes the most sense to me though. If y'all think we should go with 
> that, the new hasAttr() definition would look something like this, right?

That looks about like what I'd expect, yes.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D120949

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

Reply via email to