[clang] [clang][ASTMatcher] Add matchers for CXXFoldExpr (PR #71245)
Julian Schmidt via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 24 15:11:53 PST 2023
================
@@ -4532,6 +4563,139 @@ AST_POLYMORPHIC_MATCHER_P2(hasArgument,
return InnerMatcher.matches(*Arg->IgnoreParenImpCasts(), Finder, Builder);
}
+/// Matches the operand that does not contain the parameter pack.
+///
+/// Example matches `(0 + ... + args)` and `(args * ... * 1)`
+/// (matcher = cxxFoldExpr(hasFoldInit(expr())))
+/// with hasFoldInit(...)
+/// matching `0` and `1` respectively
+/// \code
+/// template <typename... Args>
+/// auto sum(Args... args) {
+/// return (0 + ... + args);
+/// }
+///
+/// template <typename... Args>
+/// auto multiply(Args... args) {
+/// return (args * ... * 1);
+/// }
+/// \endcode
+AST_MATCHER_P(CXXFoldExpr, hasFoldInit, ast_matchers::internal::Matcher<Expr>,
+ InnerMacher) {
+ const auto *const Init = Node.getInit();
+ return Init && InnerMacher.matches(*Init, Finder, Builder);
+}
+
+/// Matches the operand that contains the parameter pack.
+///
+/// Example matches `(0 + ... + args)`
+/// (matcher = cxxFoldExpr(hasPattern(expr())))
+/// with hasPattern(...)
+/// matching `args`
+/// \code
+/// template <typename... Args>
+/// auto sum(Args... args) {
+/// return (0 + ... + args);
+/// }
+///
+/// template <typename... Args>
+/// auto multiply(Args... args) {
+/// return (args * ... * 1);
+/// }
+/// \endcode
+AST_MATCHER_P(CXXFoldExpr, hasPattern, ast_matchers::internal::Matcher<Expr>,
+ InnerMacher) {
+ return InnerMacher.matches(*Node.getPattern(), Finder, Builder);
----------------
5chmidti wrote:
done
https://github.com/llvm/llvm-project/pull/71245
More information about the cfe-commits
mailing list