Skip to content

Commit b60f187

Browse files
committed
update_to clause support
1 parent a7a8256 commit b60f187

File tree

5 files changed

+184
-5
lines changed

5 files changed

+184
-5
lines changed

clang/include/clang/ASTMatchers/ASTMatchers.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8863,6 +8863,18 @@ AST_MATCHER_P(OMPExecutableDirective, isAllowedToContainClauseKind,
88638863
extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPFromClause>
88648864
ompFromClause;
88658865

8866+
/// Matches OpenMP ``to`` clause.
8867+
///
8868+
/// Given
8869+
///
8870+
/// \code
8871+
/// #pragma omp target update to(a)
8872+
/// \endcode
8873+
///
8874+
/// ``ompToClause()`` matches ``to(a)``.
8875+
extern const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPToClause>
8876+
ompToClause;
8877+
88668878
//----------------------------------------------------------------------------//
88678879
// End OpenMP handling.
88688880
//----------------------------------------------------------------------------//

clang/lib/ASTMatchers/ASTMatchersInternal.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,7 @@ const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPDefaultClause>
11301130
ompDefaultClause;
11311131
const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPFromClause>
11321132
ompFromClause;
1133+
const internal::VariadicDynCastAllOfMatcher<OMPClause, OMPToClause> ompToClause;
11331134
const internal::VariadicDynCastAllOfMatcher<Decl, CXXDeductionGuideDecl>
11341135
cxxDeductionGuideDecl;
11351136

clang/lib/ASTMatchers/Dynamic/Registry.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ RegistryMaps::RegistryMaps() {
529529
REGISTER_MATCHER(ofKind);
530530
REGISTER_MATCHER(ompDefaultClause);
531531
REGISTER_MATCHER(ompFromClause);
532+
REGISTER_MATCHER(ompToClause);
532533
REGISTER_MATCHER(ompExecutableDirective);
533534
REGISTER_MATCHER(ompTargetUpdateDirective);
534535
REGISTER_MATCHER(on);

clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp

Lines changed: 102 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4734,7 +4734,7 @@ void x() {
47344734
EXPECT_TRUE(matchesWithOpenMP(Source8, Matcher));
47354735
}
47364736

4737-
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_IsStandaloneDirective) {
4737+
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_From_IsStandaloneDirective) {
47384738
auto Matcher = ompTargetUpdateDirective(isStandaloneDirective());
47394739

47404740
StringRef Source0 = R"(
@@ -4747,7 +4747,20 @@ TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_IsStandaloneDirective) {
47474747
EXPECT_TRUE(matchesWithOpenMP(Source0, Matcher));
47484748
}
47494749

4750-
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_HasStructuredBlock) {
4750+
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_To_IsStandaloneDirective) {
4751+
auto Matcher = ompTargetUpdateDirective(isStandaloneDirective());
4752+
4753+
StringRef Source0 = R"(
4754+
void foo() {
4755+
int arr[8];
4756+
#pragma omp target update to(arr[0:8:2])
4757+
;
4758+
}
4759+
)";
4760+
EXPECT_TRUE(matchesWithOpenMP(Source0, Matcher));
4761+
}
4762+
4763+
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_From_HasStructuredBlock) {
47514764
StringRef Source0 = R"(
47524765
void foo() {
47534766
int arr[8];
@@ -4759,7 +4772,19 @@ TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_HasStructuredBlock) {
47594772
Source0, ompTargetUpdateDirective(hasStructuredBlock(nullStmt()))));
47604773
}
47614774

4762-
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_HasClause) {
4775+
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_To_HasStructuredBlock) {
4776+
StringRef Source0 = R"(
4777+
void foo() {
4778+
int arr[8];
4779+
#pragma omp target update to(arr[0:8:2])
4780+
;
4781+
}
4782+
)";
4783+
EXPECT_TRUE(notMatchesWithOpenMP(
4784+
Source0, ompTargetUpdateDirective(hasStructuredBlock(nullStmt()))));
4785+
}
4786+
4787+
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_From_HasClause) {
47634788
auto Matcher = ompTargetUpdateDirective(hasAnyClause(ompFromClause()));
47644789

47654790
StringRef Source0 = R"(
@@ -4812,7 +4837,58 @@ TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_HasClause) {
48124837
}
48134838
}
48144839

4815-
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_IsAllowedToContainClauseKind) {
4840+
TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_To_HasClause) {
4841+
auto Matcher = ompTargetUpdateDirective(hasAnyClause(ompToClause()));
4842+
4843+
StringRef Source0 = R"(
4844+
void foo() {
4845+
int arr[8];
4846+
#pragma omp target update to(arr[0:8:2])
4847+
;
4848+
}
4849+
)";
4850+
EXPECT_TRUE(matchesWithOpenMP(Source0, Matcher));
4851+
4852+
auto astUnit = tooling::buildASTFromCodeWithArgs(Source0, {"-fopenmp"});
4853+
ASSERT_TRUE(astUnit);
4854+
4855+
auto Results = match(ompTargetUpdateDirective().bind("directive"),
4856+
astUnit->getASTContext());
4857+
ASSERT_FALSE(Results.empty());
4858+
4859+
const auto *Directive =
4860+
Results[0].getNodeAs<OMPTargetUpdateDirective>("directive");
4861+
ASSERT_TRUE(Directive);
4862+
4863+
OMPToClause *ToClause = nullptr;
4864+
for (auto *Clause : Directive->clauses()) {
4865+
if ((ToClause = dyn_cast<OMPToClause>(Clause))) {
4866+
break;
4867+
}
4868+
}
4869+
ASSERT_TRUE(ToClause);
4870+
4871+
for (const auto *VarExpr : ToClause->varlist()) {
4872+
const auto *ArraySection = dyn_cast<ArraySectionExpr>(VarExpr);
4873+
if (!ArraySection)
4874+
continue;
4875+
4876+
const Expr *Base = ArraySection->getBase();
4877+
ASSERT_TRUE(Base);
4878+
4879+
const Expr *LowerBound = ArraySection->getLowerBound();
4880+
ASSERT_TRUE(LowerBound);
4881+
4882+
const Expr *Length = ArraySection->getLength();
4883+
ASSERT_TRUE(Length);
4884+
4885+
const Expr *Stride = ArraySection->getStride();
4886+
ASSERT_TRUE(Stride);
4887+
}
4888+
}
4889+
4890+
TEST_P(ASTMatchersTest,
4891+
OMPTargetUpdateDirective_IsAllowedToContainClauseKind_From) {
48164892
auto Matcher = ompTargetUpdateDirective(
48174893
isAllowedToContainClauseKind(llvm::omp::OMPC_from));
48184894

@@ -4833,6 +4909,28 @@ TEST_P(ASTMatchersTest, OMPTargetUpdateDirective_IsAllowedToContainClauseKind) {
48334909
EXPECT_TRUE(matchesWithOpenMP(Source1, Matcher));
48344910
}
48354911

4912+
TEST_P(ASTMatchersTest,
4913+
OMPTargetUpdateDirective_IsAllowedToContainClauseKind_To) {
4914+
auto Matcher = ompTargetUpdateDirective(
4915+
isAllowedToContainClauseKind(llvm::omp::OMPC_to));
4916+
4917+
StringRef Source0 = R"(
4918+
void x() {
4919+
;
4920+
}
4921+
)";
4922+
EXPECT_TRUE(notMatchesWithOpenMP(Source0, Matcher));
4923+
4924+
StringRef Source1 = R"(
4925+
void foo() {
4926+
int arr[8];
4927+
#pragma omp target update to(arr[0:8:2])
4928+
;
4929+
}
4930+
)";
4931+
EXPECT_TRUE(matchesWithOpenMP(Source1, Matcher));
4932+
}
4933+
48364934
TEST_P(ASTMatchersTest, HasAnyBase_DirectBase) {
48374935
if (!GetParam().isCXX()) {
48384936
return;

clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2742,7 +2742,7 @@ void x() {
27422742
EXPECT_TRUE(notMatchesWithOpenMP(Source2, Matcher));
27432743
}
27442744

2745-
TEST(ASTMatchersTestOpenMP, OMPTargetUpdateDirective) {
2745+
TEST(ASTMatchersTestOpenMP, OMPTargetUpdateDirective_From) {
27462746
auto Matcher = stmt(ompTargetUpdateDirective());
27472747

27482748
StringRef Source0 = R"(
@@ -2755,6 +2755,19 @@ TEST(ASTMatchersTestOpenMP, OMPTargetUpdateDirective) {
27552755
EXPECT_TRUE(matchesWithOpenMP(Source0, Matcher));
27562756
}
27572757

2758+
TEST(ASTMatchersTestOpenMP, OMPTargetUpdateDirective_To) {
2759+
auto Matcher = stmt(ompTargetUpdateDirective());
2760+
2761+
StringRef Source0 = R"(
2762+
void foo() {
2763+
int arr[8];
2764+
#pragma omp target update to(arr[0:8:2])
2765+
;
2766+
}
2767+
)";
2768+
EXPECT_TRUE(matchesWithOpenMP(Source0, Matcher));
2769+
}
2770+
27582771
TEST(ASTMatchersTestOpenMP, OMPFromClause) {
27592772
auto Matcher = ompTargetUpdateDirective(hasAnyClause(ompFromClause()));
27602773

@@ -2809,6 +2822,60 @@ TEST(ASTMatchersTestOpenMP, OMPFromClause) {
28092822
}
28102823
}
28112824

2825+
TEST(ASTMatchersTestOpenMP, OMPToClause) {
2826+
auto Matcher = ompTargetUpdateDirective(hasAnyClause(ompToClause()));
2827+
2828+
StringRef Source0 = R"(
2829+
void foo() {
2830+
int arr[8];
2831+
#pragma omp target update to(arr[0:8:2])
2832+
;
2833+
}
2834+
)";
2835+
EXPECT_TRUE(matchesWithOpenMP(Source0, Matcher));
2836+
2837+
auto astUnit = tooling::buildASTFromCodeWithArgs(Source0, {"-fopenmp"});
2838+
ASSERT_TRUE(astUnit);
2839+
2840+
auto Results = match(ompTargetUpdateDirective().bind("directive"),
2841+
astUnit->getASTContext());
2842+
ASSERT_FALSE(Results.empty());
2843+
2844+
const auto *Directive =
2845+
Results[0].getNodeAs<OMPTargetUpdateDirective>("directive");
2846+
ASSERT_TRUE(Directive);
2847+
2848+
OMPToClause *ToClause = nullptr;
2849+
for (auto *Clause : Directive->clauses()) {
2850+
if ((ToClause = dyn_cast<OMPToClause>(Clause))) {
2851+
break;
2852+
}
2853+
}
2854+
ASSERT_TRUE(ToClause);
2855+
2856+
for (const auto *VarExpr : ToClause->varlist()) {
2857+
const auto *ArraySection = dyn_cast<ArraySectionExpr>(VarExpr);
2858+
if (!ArraySection)
2859+
continue;
2860+
2861+
// base (arr)
2862+
const Expr *Base = ArraySection->getBase();
2863+
ASSERT_TRUE(Base);
2864+
2865+
// lower bound (0)
2866+
const Expr *LowerBound = ArraySection->getLowerBound();
2867+
ASSERT_TRUE(LowerBound);
2868+
2869+
// length (8)
2870+
const Expr *Length = ArraySection->getLength();
2871+
ASSERT_TRUE(Length);
2872+
2873+
// stride (2)
2874+
const Expr *Stride = ArraySection->getStride();
2875+
ASSERT_TRUE(Stride);
2876+
}
2877+
}
2878+
28122879
TEST(ASTMatchersTestOpenMP, OMPDefaultClause) {
28132880
auto Matcher = ompExecutableDirective(hasAnyClause(ompDefaultClause()));
28142881

0 commit comments

Comments
 (0)