diff options
-rw-r--r-- | docs/LibASTMatchersReference.html | 14 | ||||
-rw-r--r-- | include/clang/ASTMatchers/ASTMatchers.h | 24 | ||||
-rw-r--r-- | lib/ASTMatchers/ASTMatchersInternal.cpp | 3 | ||||
-rw-r--r-- | lib/ASTMatchers/Dynamic/Registry.cpp | 1 | ||||
-rw-r--r-- | unittests/AST/OMPStructuredBlockTest.cpp | 4 | ||||
-rw-r--r-- | unittests/ASTMatchers/ASTMatchersNodeTest.cpp | 24 | ||||
-rw-r--r-- | unittests/ASTMatchers/ASTMatchersTest.h | 12 |
7 files changed, 78 insertions, 4 deletions
diff --git a/docs/LibASTMatchersReference.html b/docs/LibASTMatchersReference.html index d2984844a4..298faa782b 100644 --- a/docs/LibASTMatchersReference.html +++ b/docs/LibASTMatchersReference.html @@ -1375,6 +1375,20 @@ Example matches @try </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('ompExecutableDirective0')"><a name="ompExecutableDirective0Anchor">ompExecutableDirective</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OMPExecutableDirective.html">OMPExecutableDirective</a>>...</td></tr> +<tr><td colspan="4" class="doc" id="ompExecutableDirective0"><pre>Matches any ``#pragma omp`` executable directive. + +Given + + #pragma omp parallel + #pragma omp parallel default(none) + #pragma omp taskyield + +``ompExecutableDirective()`` matches ``omp parallel``, +``omp parallel default(none)`` and ``omp taskyield``. +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('opaqueValueExpr0')"><a name="opaqueValueExpr0Anchor">opaqueValueExpr</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1OpaqueValueExpr.html">OpaqueValueExpr</a>>...</td></tr> <tr><td colspan="4" class="doc" id="opaqueValueExpr0"><pre>Matches opaque value expressions. They are used as helpers to reference another expressions and can be met diff --git a/include/clang/ASTMatchers/ASTMatchers.h b/include/clang/ASTMatchers/ASTMatchers.h index 1f3e1f936d..08a039e005 100644 --- a/include/clang/ASTMatchers/ASTMatchers.h +++ b/include/clang/ASTMatchers/ASTMatchers.h @@ -60,6 +60,7 @@ #include "clang/AST/Stmt.h" #include "clang/AST/StmtCXX.h" #include "clang/AST/StmtObjC.h" +#include "clang/AST/StmtOpenMP.h" #include "clang/AST/TemplateBase.h" #include "clang/AST/TemplateName.h" #include "clang/AST/Type.h" @@ -6369,6 +6370,29 @@ AST_MATCHER(FunctionDecl, hasTrailingReturn) { return false; } +//----------------------------------------------------------------------------// +// OpenMP handling. +//----------------------------------------------------------------------------// + +/// Matches any ``#pragma omp`` executable directive. +/// +/// Given +/// +/// \code +/// #pragma omp parallel +/// #pragma omp parallel default(none) +/// #pragma omp taskyield +/// \endcode +/// +/// ``ompExecutableDirective()`` matches ``omp parallel``, +/// ``omp parallel default(none)`` and ``omp taskyield``. +extern const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective> + ompExecutableDirective; + +//----------------------------------------------------------------------------// +// End OpenMP handling. +//----------------------------------------------------------------------------// + } // namespace ast_matchers } // namespace clang diff --git a/lib/ASTMatchers/ASTMatchersInternal.cpp b/lib/ASTMatchers/ASTMatchersInternal.cpp index 8c75b76156..654a6c28c0 100644 --- a/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -845,5 +845,8 @@ AST_TYPELOC_TRAVERSE_MATCHER_DEF( AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType, PointerType, ReferenceType)); +const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective> + ompExecutableDirective; + } // end namespace ast_matchers } // end namespace clang diff --git a/lib/ASTMatchers/Dynamic/Registry.cpp b/lib/ASTMatchers/Dynamic/Registry.cpp index 69b1b7da07..4982721b4e 100644 --- a/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/lib/ASTMatchers/Dynamic/Registry.cpp @@ -434,6 +434,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(objcThrowStmt); REGISTER_MATCHER(objcTryStmt); REGISTER_MATCHER(ofClass); + REGISTER_MATCHER(ompExecutableDirective); REGISTER_MATCHER(on); REGISTER_MATCHER(onImplicitObjectArgument); REGISTER_MATCHER(opaqueValueExpr); diff --git a/unittests/AST/OMPStructuredBlockTest.cpp b/unittests/AST/OMPStructuredBlockTest.cpp index 4cb51c0a87..7b2028b07c 100644 --- a/unittests/AST/OMPStructuredBlockTest.cpp +++ b/unittests/AST/OMPStructuredBlockTest.cpp @@ -28,10 +28,6 @@ namespace { AST_MATCHER(Stmt, isOMPStructuredBlock) { return Node.isOMPStructuredBlock(); } const ast_matchers::internal::VariadicDynCastAllOfMatcher< - Stmt, OMPExecutableDirective> - ompExecutableDirective; - -const ast_matchers::internal::VariadicDynCastAllOfMatcher< OMPExecutableDirective, OMPTargetDirective> ompTargetDirective; diff --git a/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/unittests/ASTMatchers/ASTMatchersNodeTest.cpp index 3f9981cd6d..4bce409cab 100644 --- a/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -1765,5 +1765,29 @@ TEST(ObjCAutoreleaseMatcher, AutoreleasePool) { EXPECT_FALSE(matchesObjC(ObjCStringNoPool, autoreleasePoolStmt())); } +TEST(OMPExecutableDirective, Matches) { + auto Matcher = stmt(ompExecutableDirective()); + + const std::string Source0 = R"( +void x() { +#pragma omp parallel +; +})"; + EXPECT_TRUE(matchesWithOpenMP(Source0, Matcher)); + + const std::string Source1 = R"( +void x() { +#pragma omp taskyield +; +})"; + EXPECT_TRUE(matchesWithOpenMP(Source1, Matcher)); + + const std::string Source2 = R"( +void x() { +; +})"; + EXPECT_TRUE(notMatchesWithOpenMP(Source2, Matcher)); +} + } // namespace ast_matchers } // namespace clang diff --git a/unittests/ASTMatchers/ASTMatchersTest.h b/unittests/ASTMatchers/ASTMatchersTest.h index b22cafefd9..3f3118c2ef 100644 --- a/unittests/ASTMatchers/ASTMatchersTest.h +++ b/unittests/ASTMatchers/ASTMatchersTest.h @@ -235,6 +235,18 @@ testing::AssertionResult notMatchesWithCuda(const std::string &Code, } template <typename T> +testing::AssertionResult matchesWithOpenMP(const std::string &Code, + const T &AMatcher) { + return matchesConditionally(Code, AMatcher, true, "-fopenmp"); +} + +template <typename T> +testing::AssertionResult notMatchesWithOpenMP(const std::string &Code, + const T &AMatcher) { + return matchesConditionally(Code, AMatcher, false, "-fopenmp"); +} + +template <typename T> testing::AssertionResult matchAndVerifyResultConditionally(const std::string &Code, const T &AMatcher, std::unique_ptr<BoundNodesCallback> FindResultVerifier, |