[PATCH] D120949: [clang][AST matchers] adding attributedStmt AST matcher

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 4 04:16:32 PST 2022


aaron.ballman added a subscriber: sammccall.
aaron.ballman added a comment.

In D120949#3358707 <https://reviews.llvm.org/D120949#3358707>, @ajohnson-uoregon wrote:

> Okay this is actually the right commits now, sorry about the spam, Aaron. 🙃 Didn't realize I'd put unrelated things in the first commit.

No worries! I usually review AST matcher changes anyway, so there's definitely no harm in tagging me. :-)

You also need to add some test coverage for the changes to `clang/unittests/ASTMatchers/` and you also need to regenerate the documentation by running `clang/docs/tools/dump_ast_matchers.py`.



================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2704-2712
+/// Example: Matches [[likely]] and [[unlikely]]
+/// \code
+///   constexpr double pow(double x, long long n) noexcept {
+///     if (n > 0) [[likely]]
+///          return x * pow(x, n - 1);
+///     else [[unlikely]]
+///          return 1;
----------------



================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2713-2714
+/// \endcode
+extern const internal::VariadicDynCastAllOfMatcher<Stmt, AttributedStmt>
+    attributedStmt;
+
----------------
Design-wise, I'm on the fence here. AST matchers match the AST nodes that Clang produces, and from that perspective, this makes a lot of sense. But `AttributedStmt` is a bit of a hack in some ways, and do we want to expose that hack to AST matcher users? e.g., is there a reason we shouldn't make `returnStmt(hasAttr(attr::Likely))` work directly rather than making the user pick their way through the `AttributedStmt`? This is more in line with how you check for a declaration with a particular attribute and seems like the more natural way to surface this.

For the moment, since this is following the current AST structure in Clang, I think this is fine. But I'm curious if @klimek or perhaps @sammccall has an opinion here.


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2722
+/// \endcode
+/// would only match [[likely]] here:
+/// \code
----------------



================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2732-2737
+  for (const auto *Attr : Node.getAttrs()) {
+    if (Attr->getKind() == AttrKind) {
+      return true;
+    }
+  }
+  return false;
----------------
Probably have to reformat this as well.


================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2746
+/// \endcode
+/// would match return 1; here:
+/// \code
----------------



================
Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:2753-2755
+  const Stmt *const Statement = Node.getSubStmt();
+  return (Statement != nullptr &&
+          InnerMatcher.matches(*Statement, Finder, Builder));
----------------



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D120949



More information about the cfe-commits mailing list