ccotter updated this revision to Diff 487661.
ccotter marked an inline comment as not done.
ccotter added a comment.
- Add hasBody matcher support for coroutineBodyStmt
- update doc
- Sort list
- clang-format
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140794/new/
https://reviews.llvm.org/D140794
Files:
clang/docs/ReleaseNotes.rst
clang/include/clang/ASTMatchers/ASTMatchers.h
clang/lib/ASTMatchers/ASTMatchersInternal.cpp
clang/lib/ASTMatchers/Dynamic/Registry.cpp
clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
Index: clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===================================================================
--- clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -678,6 +678,48 @@
EXPECT_TRUE(matchesConditionally(CoYieldCode,
coyieldExpr(isExpansionInMainFile()),
true, {"-std=c++20", "-I/"}, M));
+
+ StringRef NonCoroCode = R"cpp(
+#include <coro_header>
+void non_coro_function() {
+}
+)cpp";
+
+ EXPECT_TRUE(matchesConditionally(CoReturnCode, coroutineBodyStmt(), true,
+ {"-std=c++20", "-I/"}, M));
+ EXPECT_TRUE(matchesConditionally(CoAwaitCode, coroutineBodyStmt(), true,
+ {"-std=c++20", "-I/"}, M));
+ EXPECT_TRUE(matchesConditionally(CoYieldCode, coroutineBodyStmt(), true,
+ {"-std=c++20", "-I/"}, M));
+
+ EXPECT_FALSE(matchesConditionally(NonCoroCode, coroutineBodyStmt(), true,
+ {"-std=c++20", "-I/"}, M));
+
+ StringRef CoroWithDeclCode = R"cpp(
+#include <coro_header>
+void coro() {
+ int thevar;
+ co_return 1;
+}
+)cpp";
+ EXPECT_TRUE(matchesConditionally(
+ CoroWithDeclCode,
+ coroutineBodyStmt(hasBody(compoundStmt(
+ has(declStmt(containsDeclaration(0, varDecl(hasName("thevar")))))))),
+ true, {"-std=c++20", "-I/"}, M));
+
+ StringRef CoroWithTryCatchDeclCode = R"cpp(
+#include <coro_header>
+void coro() try {
+ int thevar;
+ co_return 1;
+} catch (...) {}
+)cpp";
+ EXPECT_TRUE(matchesConditionally(
+ CoroWithTryCatchDeclCode,
+ coroutineBodyStmt(hasBody(cxxTryStmt(has(compoundStmt(has(
+ declStmt(containsDeclaration(0, varDecl(hasName("thevar")))))))))),
+ true, {"-std=c++20", "-I/"}, M));
}
TEST(Matcher, isClassMessage) {
Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp
===================================================================
--- clang/lib/ASTMatchers/Dynamic/Registry.cpp
+++ clang/lib/ASTMatchers/Dynamic/Registry.cpp
@@ -175,6 +175,7 @@
REGISTER_MATCHER(containsDeclaration);
REGISTER_MATCHER(continueStmt);
REGISTER_MATCHER(coreturnStmt);
+ REGISTER_MATCHER(coroutineBodyStmt);
REGISTER_MATCHER(coyieldExpr);
REGISTER_MATCHER(cudaKernelCallExpr);
REGISTER_MATCHER(cxxBaseSpecifier);
Index: clang/lib/ASTMatchers/ASTMatchersInternal.cpp
===================================================================
--- clang/lib/ASTMatchers/ASTMatchersInternal.cpp
+++ clang/lib/ASTMatchers/ASTMatchersInternal.cpp
@@ -909,6 +909,8 @@
const internal::VariadicDynCastAllOfMatcher<Stmt, CaseStmt> caseStmt;
const internal::VariadicDynCastAllOfMatcher<Stmt, DefaultStmt> defaultStmt;
const internal::VariadicDynCastAllOfMatcher<Stmt, CompoundStmt> compoundStmt;
+const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
+ coroutineBodyStmt;
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXCatchStmt> cxxCatchStmt;
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXTryStmt> cxxTryStmt;
const internal::VariadicDynCastAllOfMatcher<Stmt, CXXThrowExpr> cxxThrowExpr;
Index: clang/include/clang/ASTMatchers/ASTMatchers.h
===================================================================
--- clang/include/clang/ASTMatchers/ASTMatchers.h
+++ clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -2449,6 +2449,17 @@
extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoyieldExpr>
coyieldExpr;
+/// Matches coroutine body statements.
+///
+/// coroutineBodyStmt() matches the coroutine below
+/// \code
+/// generator<int> gen() {
+/// co_return;
+/// }
+/// \endcode
+extern const internal::VariadicDynCastAllOfMatcher<Stmt, CoroutineBodyStmt>
+ coroutineBodyStmt;
+
/// Matches nullptr literal.
extern const internal::VariadicDynCastAllOfMatcher<Stmt, CXXNullPtrLiteralExpr>
cxxNullPtrLiteralExpr;
@@ -5460,9 +5471,9 @@
}
/// Matches a 'for', 'while', 'do while' statement or a function
-/// definition that has a given body. Note that in case of functions
-/// this matcher only matches the definition itself and not the other
-/// declarations of the same function.
+/// or coroutine definition that has a given body. Note that in case of
+/// functions this matcher only matches the definition itself and not
+/// the other declarations of the same function.
///
/// Given
/// \code
@@ -5484,12 +5495,11 @@
/// matching '{}'
/// but does not match 'void f();'
-AST_POLYMORPHIC_MATCHER_P(hasBody,
- AST_POLYMORPHIC_SUPPORTED_TYPES(DoStmt, ForStmt,
- WhileStmt,
- CXXForRangeStmt,
- FunctionDecl),
- internal::Matcher<Stmt>, InnerMatcher) {
+AST_POLYMORPHIC_MATCHER_P(
+ hasBody,
+ AST_POLYMORPHIC_SUPPORTED_TYPES(DoStmt, ForStmt, WhileStmt, CXXForRangeStmt,
+ FunctionDecl, CoroutineBodyStmt),
+ internal::Matcher<Stmt>, InnerMatcher) {
if (Finder->isTraversalIgnoringImplicitNodes() && isDefaultedHelper(&Node))
return false;
const Stmt *const Statement = internal::GetBodyMatcher<NodeType>::get(Node);
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -868,6 +868,8 @@
------------
- Add ``isInAnoymousNamespace`` matcher to match declarations in an anonymous namespace.
+- Add ``coroutineBodyStmt`` matcher.
+
clang-format
------------
- Add ``RemoveSemicolon`` option for removing ``;`` after a non-empty function definition.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits