[PATCH] D124373: [clang] add parameter pack/pack expansion matchers
Tobias Ribizel via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 27 05:20:54 PDT 2022
upsj updated this revision to Diff 425487.
upsj added a comment.
formatting
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124373/new/
https://reviews.llvm.org/D124373
Files:
clang/include/clang/ASTMatchers/ASTMatchers.h
clang/lib/ASTMatchers/ASTMatchersInternal.cpp
clang/lib/ASTMatchers/Dynamic/Registry.cpp
Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp
===================================================================
--- clang/lib/ASTMatchers/Dynamic/Registry.cpp
+++ clang/lib/ASTMatchers/Dynamic/Registry.cpp
@@ -446,6 +446,7 @@
REGISTER_MATCHER(isNoThrow);
REGISTER_MATCHER(isNoneKind);
REGISTER_MATCHER(isOverride);
+ REGISTER_MATCHER(isParameterPack);
REGISTER_MATCHER(isPrivate);
REGISTER_MATCHER(isProtected);
REGISTER_MATCHER(isPublic);
@@ -513,6 +514,7 @@
REGISTER_MATCHER(onImplicitObjectArgument);
REGISTER_MATCHER(opaqueValueExpr);
REGISTER_MATCHER(optionally);
+ REGISTER_MATCHER(packExpansionExpr);
REGISTER_MATCHER(parameterCountIs);
REGISTER_MATCHER(parenExpr);
REGISTER_MATCHER(parenListExpr);
Index: clang/lib/ASTMatchers/ASTMatchersInternal.cpp
===================================================================
--- clang/lib/ASTMatchers/ASTMatchersInternal.cpp
+++ clang/lib/ASTMatchers/ASTMatchersInternal.cpp
@@ -981,6 +981,8 @@
predefinedExpr;
const internal::VariadicDynCastAllOfMatcher<Stmt, DesignatedInitExpr>
designatedInitExpr;
+const internal::VariadicDynCastAllOfMatcher<Stmt, PackExpansionExpr>
+ packExpansionExpr;
const internal::VariadicOperatorMatcherFunc<
2, std::numeric_limits<unsigned>::max()>
eachOf = {internal::DynTypedMatcher::VO_EachOf};
Index: clang/include/clang/ASTMatchers/ASTMatchers.h
===================================================================
--- clang/include/clang/ASTMatchers/ASTMatchers.h
+++ clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -731,6 +731,27 @@
InnerMatcher.matches(*Initializer, Finder, Builder));
}
+/// Determines whether a declaration is a parameter pack.
+///
+/// Given
+/// \code
+/// template <typename A, typename... Bs,
+/// int i, int... js,
+/// template <typename> class C,
+/// template <typename> class... Ds>
+/// void foo(A param, Bs... params);
+/// \endcode
+/// templateTypeParmDecl(isParameterPack())
+/// matches 'typename... Bs', but not 'typename A'.
+/// nonTypeTemplateParmDecl(isParameterPack())
+/// matches 'int... js', but not 'int i'.
+/// templateTemplateParmDecl(isParameterPack())
+/// matches 'template <typename> class... Ds', but not
+/// 'template <typename> class C'
+/// varDecl(isParameterPack())
+/// matches 'Bs... params', but not 'A param'.
+AST_MATCHER(Decl, isParameterPack) { return Node.isParameterPack(); }
+
/// Determines whether the function is "main", which is the entry point
/// into an executable program.
AST_MATCHER(FunctionDecl, isMain) {
@@ -2699,6 +2720,21 @@
return Node.size() == N;
}
+/// Matches pack expansion expressions.
+///
+/// Given
+/// \code
+/// void bar(int, int);
+/// template <typename T, typename... Args>
+/// void foo(T arg, Args args...) {
+/// bar(arg + 1, (args + 1)...);
+/// }
+/// \endcode
+/// packExpansionExpr()
+/// matches '(args + 1)...', but not 'arg + 1'.
+extern const internal::VariadicDynCastAllOfMatcher<Stmt, PackExpansionExpr>
+ packExpansionExpr;
+
/// Matches \c QualTypes in the clang AST.
extern const internal::VariadicAllOfMatcher<QualType> qualType;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124373.425487.patch
Type: text/x-patch
Size: 3181 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220427/3420e70d/attachment.bin>
More information about the cfe-commits
mailing list