Skip to content

Commit 1267488

Browse files
authored
[flang][OpenMP] Frontend support for DIMS modifier (#171454)
Add parsing and semantic checks for DIMS modifier on NUM_TEAMS, NUM_THREADS, and THREAD_LIMIT.
1 parent 6cacbdb commit 1267488

File tree

12 files changed

+358
-15
lines changed

12 files changed

+358
-15
lines changed

flang/include/flang/Parser/dump-parse-tree.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,7 @@ class ParseTreeDumper {
587587
NODE(parser, OmpDeviceSafesyncClause)
588588
NODE(parser, OmpDeviceTypeClause)
589589
NODE_ENUM(OmpDeviceTypeClause, DeviceTypeDescription)
590+
NODE(parser, OmpDimsModifier)
590591
NODE(parser, OmpDirectiveName)
591592
NODE(parser, OmpDirectiveSpecification)
592593
NODE_ENUM(OmpDirectiveSpecification, Flag)
@@ -646,6 +647,7 @@ class ParseTreeDumper {
646647
NODE(parser, OmpLocator)
647648
NODE(parser, OmpLocatorList)
648649
NODE(parser, OmpLooprangeClause)
650+
NODE(parser, OmpLowerBound)
649651
NODE(parser, OmpMapClause)
650652
NODE(OmpMapClause, Modifier)
651653
NODE(parser, OmpMapper)
@@ -662,6 +664,10 @@ class ParseTreeDumper {
662664
NODE(parser, OmpNoParallelismClause)
663665
NODE(parser, OmpNothingDirective)
664666
NODE(parser, OmpNumTasksClause)
667+
NODE(parser, OmpNumTeamsClause)
668+
NODE(OmpNumTeamsClause, Modifier)
669+
NODE(parser, OmpNumThreadsClause)
670+
NODE(OmpNumThreadsClause, Modifier)
665671
NODE(OmpNumTasksClause, Modifier)
666672
NODE(parser, OmpObject)
667673
NODE(OmpObject, Invalid)
@@ -709,6 +715,8 @@ class ParseTreeDumper {
709715
NODE_ENUM(OmpTaskDependenceType, Value)
710716
NODE(parser, OmpTaskReductionClause)
711717
NODE(OmpTaskReductionClause, Modifier)
718+
NODE(parser, OmpThreadLimitClause)
719+
NODE(OmpThreadLimitClause, Modifier)
712720
NODE(parser, OmpThreadsetClause)
713721
NODE_ENUM(OmpThreadsetClause, ThreadsetPolicy)
714722
NODE(parser, OmpToClause)

flang/include/flang/Parser/parse-tree.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3979,6 +3979,14 @@ struct OmpDeviceModifier {
39793979
WRAPPER_CLASS_BOILERPLATE(OmpDeviceModifier, Value);
39803980
};
39813981

3982+
// Ref: TODO
3983+
//
3984+
// dims-modifier ->
3985+
// constant integer expression // since 6.1
3986+
struct OmpDimsModifier {
3987+
WRAPPER_CLASS_BOILERPLATE(OmpDimsModifier, ScalarIntConstantExpr);
3988+
};
3989+
39823990
// Ref: [5.2:72-73,230-323], in 4.5-5.1 it's scattered over individual
39833991
// directives that allow the IF clause.
39843992
//
@@ -4089,6 +4097,14 @@ struct OmpLinearModifier {
40894097
WRAPPER_CLASS_BOILERPLATE(OmpLinearModifier, Value);
40904098
};
40914099

4100+
// Ref: [5.1:100-104], [5.2:277], [6.0:452-453]
4101+
//
4102+
// lower-bound ->
4103+
// scalar-integer-expression // since 5.1
4104+
struct OmpLowerBound {
4105+
WRAPPER_CLASS_BOILERPLATE(OmpLowerBound, ScalarIntExpr);
4106+
};
4107+
40924108
// Ref: [5.0:176-180], [5.1:205-210], [5.2:149-150]
40934109
//
40944110
// mapper ->
@@ -4750,6 +4766,30 @@ struct OmpNumTasksClause {
47504766
std::tuple<MODIFIERS(), ScalarIntExpr> t;
47514767
};
47524768

4769+
// Ref: [4.5:114-116], [5.0:82-85], [5.1:100-104], [5.2:277], [6.0:452-453]
4770+
//
4771+
// num-teams-clause ->
4772+
// NUM_TEAMS(expr) | // since 4.5
4773+
// NUM_TEAMS([lower-bound:] upper-bound) | // since 5.1
4774+
// NUM_TEAMS([dims: upper-bound...) // since 6.1
4775+
struct OmpNumTeamsClause {
4776+
TUPLE_CLASS_BOILERPLATE(OmpNumTeamsClause);
4777+
MODIFIER_BOILERPLATE(OmpDimsModifier, OmpLowerBound);
4778+
std::tuple<MODIFIERS(), std::list<ScalarIntExpr>> t;
4779+
};
4780+
4781+
// Ref: [4.5:46-50], [5.0:74-78], [5.1:92-96], [5.2:227], [6.0:388-389]
4782+
//
4783+
// num-threads-clause
4784+
// NUM_THREADS(expr) | // since 4.5
4785+
// NUM_THREADS(expr...) | // since 6.0
4786+
// NUM_THREADS([dims-modifier:] expr...) // since 6.1
4787+
struct OmpNumThreadsClause {
4788+
TUPLE_CLASS_BOILERPLATE(OmpNumThreadsClause);
4789+
MODIFIER_BOILERPLATE(OmpDimsModifier);
4790+
std::tuple<MODIFIERS(), std::list<ScalarIntExpr>> t;
4791+
};
4792+
47534793
// Ref: [5.0:101-109], [5.1:126-134], [5.2:233-234]
47544794
//
47554795
// order-clause ->
@@ -4855,6 +4895,17 @@ struct OmpTaskReductionClause {
48554895
std::tuple<MODIFIERS(), OmpObjectList> t;
48564896
};
48574897

4898+
// Ref: [4.5:114-116], [5.0:82-85], [5.1:100-104], [5.2:277], [6.0:452-453]
4899+
//
4900+
// thread-limit-clause ->
4901+
// THREAD_LIMIT(threadlim) // since 4.5
4902+
// THREAD_LIMIT([dims-modifier:] threadlim...) // since 6.1
4903+
struct OmpThreadLimitClause {
4904+
TUPLE_CLASS_BOILERPLATE(OmpThreadLimitClause);
4905+
MODIFIER_BOILERPLATE(OmpDimsModifier);
4906+
std::tuple<MODIFIERS(), std::list<ScalarIntExpr>> t;
4907+
};
4908+
48584909
// Ref: [6.0:442]
48594910
// threadset-clause ->
48604911
// THREADSET(omp_pool|omp_team)

flang/include/flang/Semantics/openmp-modifiers.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ DECLARE_DESCRIPTOR(parser::OmpContextSelector);
8181
DECLARE_DESCRIPTOR(parser::OmpDeleteModifier);
8282
DECLARE_DESCRIPTOR(parser::OmpDependenceType);
8383
DECLARE_DESCRIPTOR(parser::OmpDeviceModifier);
84+
DECLARE_DESCRIPTOR(parser::OmpDimsModifier);
8485
DECLARE_DESCRIPTOR(parser::OmpDirectiveNameModifier);
8586
DECLARE_DESCRIPTOR(parser::OmpExpectation);
8687
DECLARE_DESCRIPTOR(parser::OmpFallbackModifier);
@@ -89,6 +90,7 @@ DECLARE_DESCRIPTOR(parser::OmpInteropType);
8990
DECLARE_DESCRIPTOR(parser::OmpIterator);
9091
DECLARE_DESCRIPTOR(parser::OmpLastprivateModifier);
9192
DECLARE_DESCRIPTOR(parser::OmpLinearModifier);
93+
DECLARE_DESCRIPTOR(parser::OmpLowerBound);
9294
DECLARE_DESCRIPTOR(parser::OmpMapper);
9395
DECLARE_DESCRIPTOR(parser::OmpMapType);
9496
DECLARE_DESCRIPTOR(parser::OmpMapTypeModifier);

flang/lib/Lower/OpenMP/Clauses.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,16 +1253,20 @@ NumTasks make(const parser::OmpClause::NumTasks &inp,
12531253

12541254
NumTeams make(const parser::OmpClause::NumTeams &inp,
12551255
semantics::SemanticsContext &semaCtx) {
1256-
// inp.v -> parser::ScalarIntExpr
1256+
// inp.v -> parser::OmpNumTeamsClause
1257+
auto &t1 = std::get<std::list<parser::ScalarIntExpr>>(inp.v.t);
1258+
assert(!t1.empty());
12571259
List<NumTeams::Range> v{{{/*LowerBound=*/std::nullopt,
1258-
/*UpperBound=*/makeExpr(inp.v, semaCtx)}}};
1260+
/*UpperBound=*/makeExpr(t1.front(), semaCtx)}}};
12591261
return NumTeams{/*List=*/v};
12601262
}
12611263

12621264
NumThreads make(const parser::OmpClause::NumThreads &inp,
12631265
semantics::SemanticsContext &semaCtx) {
1264-
// inp.v -> parser::ScalarIntExpr
1265-
return NumThreads{/*Nthreads=*/makeExpr(inp.v, semaCtx)};
1266+
// inp.v -> parser::OmpNumThreadsClause
1267+
auto &t1 = std::get<std::list<parser::ScalarIntExpr>>(inp.v.t);
1268+
assert(!t1.empty());
1269+
return NumThreads{/*Nthreads=*/makeExpr(t1.front(), semaCtx)};
12661270
}
12671271

12681272
// OmpxAttribute: empty
@@ -1504,8 +1508,10 @@ TaskReduction make(const parser::OmpClause::TaskReduction &inp,
15041508

15051509
ThreadLimit make(const parser::OmpClause::ThreadLimit &inp,
15061510
semantics::SemanticsContext &semaCtx) {
1507-
// inp.v -> parser::ScalarIntExpr
1508-
return ThreadLimit{/*Threadlim=*/makeExpr(inp.v, semaCtx)};
1511+
// inp.v -> parser::OmpThreadLimitClause
1512+
auto &t1 = std::get<std::list<parser::ScalarIntExpr>>(inp.v.t);
1513+
assert(!t1.empty());
1514+
return ThreadLimit{/*Threadlim=*/makeExpr(t1.front(), semaCtx)};
15091515
}
15101516

15111517
Threadset make(const parser::OmpClause::Threadset &inp,

flang/lib/Parser/openmp-parsers.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,9 @@ TYPE_PARSER(construct<OmpDeviceModifier>(
817817
"ANCESTOR" >> pure(OmpDeviceModifier::Value::Ancestor) ||
818818
"DEVICE_NUM" >> pure(OmpDeviceModifier::Value::Device_Num)))
819819

820+
TYPE_PARSER(construct<OmpDimsModifier>( //
821+
"DIMS" >> parenthesized(scalarIntConstantExpr)))
822+
820823
TYPE_PARSER(construct<OmpDirectiveNameModifier>(OmpDirectiveNameParser{}))
821824

822825
TYPE_PARSER(construct<OmpExpectation>( //
@@ -871,6 +874,8 @@ TYPE_PARSER(construct<OmpLinearModifier>( //
871874
"VAL" >> pure(OmpLinearModifier::Value::Val) ||
872875
"UVAL" >> pure(OmpLinearModifier::Value::Uval)))
873876

877+
TYPE_PARSER(construct<OmpLowerBound>(scalarIntExpr))
878+
874879
TYPE_PARSER(construct<OmpMapper>( //
875880
"MAPPER"_tok >> parenthesized(Parser<ObjectName>{})))
876881

@@ -1015,6 +1020,13 @@ TYPE_PARSER(
10151020
TYPE_PARSER(sourced(
10161021
construct<OmpNumTasksClause::Modifier>(Parser<OmpPrescriptiveness>{})))
10171022

1023+
TYPE_PARSER(sourced( //
1024+
construct<OmpNumTeamsClause::Modifier>(Parser<OmpDimsModifier>{}) ||
1025+
construct<OmpNumTeamsClause::Modifier>(Parser<OmpLowerBound>{})))
1026+
1027+
TYPE_PARSER(sourced(
1028+
construct<OmpNumThreadsClause::Modifier>(Parser<OmpDimsModifier>{})))
1029+
10181030
TYPE_PARSER(sourced(construct<OmpReductionClause::Modifier>(sourced(
10191031
construct<OmpReductionClause::Modifier>(Parser<OmpReductionModifier>{}) ||
10201032
construct<OmpReductionClause::Modifier>(
@@ -1027,6 +1039,9 @@ TYPE_PARSER(sourced(construct<OmpScheduleClause::Modifier>(sourced(
10271039
TYPE_PARSER(sourced(construct<OmpTaskReductionClause::Modifier>(
10281040
Parser<OmpReductionIdentifier>{})))
10291041

1042+
TYPE_PARSER(sourced(
1043+
construct<OmpThreadLimitClause::Modifier>(Parser<OmpDimsModifier>{})))
1044+
10301045
TYPE_PARSER(sourced(construct<OmpToClause::Modifier>(
10311046
sourced(construct<OmpToClause::Modifier>(Parser<OmpExpectation>{}) ||
10321047
construct<OmpToClause::Modifier>(Parser<OmpMapper>{}) ||
@@ -1197,6 +1212,10 @@ TYPE_PARSER(construct<OmpTaskReductionClause>(
11971212
maybe(nonemptyList(Parser<OmpTaskReductionClause::Modifier>{}) / ":"),
11981213
Parser<OmpObjectList>{}))
11991214

1215+
TYPE_PARSER(construct<OmpThreadLimitClause>(
1216+
maybe(nonemptyList(Parser<OmpThreadLimitClause::Modifier>{}) / ":"),
1217+
nonemptyList(scalarIntExpr)))
1218+
12001219
TYPE_PARSER(construct<OmpTransparentClause>(scalarIntExpr))
12011220

12021221
TYPE_PARSER(construct<OmpThreadsetClause>(
@@ -1328,6 +1347,14 @@ TYPE_PARSER(construct<OmpNumTasksClause>(
13281347
maybe(nonemptyList(Parser<OmpNumTasksClause::Modifier>{}) / ":"),
13291348
scalarIntExpr))
13301349

1350+
TYPE_PARSER(construct<OmpNumTeamsClause>(
1351+
maybe(nonemptyList(Parser<OmpNumTeamsClause::Modifier>{}) / ":"),
1352+
nonemptyList(scalarIntExpr)))
1353+
1354+
TYPE_PARSER(construct<OmpNumThreadsClause>(
1355+
maybe(nonemptyList(Parser<OmpNumThreadsClause::Modifier>{}) / ":"),
1356+
nonemptyList(scalarIntExpr)))
1357+
13311358
TYPE_PARSER( //
13321359
construct<OmpObject>(designator) ||
13331360
"/" >> construct<OmpObject>(name) / "/" ||
@@ -1501,9 +1528,9 @@ TYPE_PARSER( //
15011528
"NUM_TASKS" >> construct<OmpClause>(construct<OmpClause::NumTasks>(
15021529
parenthesized(Parser<OmpNumTasksClause>{}))) ||
15031530
"NUM_TEAMS" >> construct<OmpClause>(construct<OmpClause::NumTeams>(
1504-
parenthesized(scalarIntExpr))) ||
1531+
parenthesized(Parser<OmpNumTeamsClause>{}))) ||
15051532
"NUM_THREADS" >> construct<OmpClause>(construct<OmpClause::NumThreads>(
1506-
parenthesized(scalarIntExpr))) ||
1533+
parenthesized(Parser<OmpNumThreadsClause>{}))) ||
15071534
"OMPX_BARE" >> construct<OmpClause>(construct<OmpClause::OmpxBare>()) ||
15081535
"ORDER" >> construct<OmpClause>(construct<OmpClause::Order>(
15091536
parenthesized(Parser<OmpOrderClause>{}))) ||
@@ -1558,7 +1585,7 @@ TYPE_PARSER( //
15581585
"THREADSET" >> construct<OmpClause>(construct<OmpClause::Threadset>(
15591586
parenthesized(Parser<OmpThreadsetClause>{}))) ||
15601587
"THREAD_LIMIT" >> construct<OmpClause>(construct<OmpClause::ThreadLimit>(
1561-
parenthesized(scalarIntExpr))) ||
1588+
parenthesized(Parser<OmpThreadLimitClause>{}))) ||
15621589
"TO" >> construct<OmpClause>(construct<OmpClause::To>(
15631590
parenthesized(Parser<OmpToClause>{}))) ||
15641591
"TRANSPARENT" >>

flang/lib/Parser/unparse.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2225,6 +2225,12 @@ class UnparseVisitor {
22252225
unsigned ompVersion{langOpts_.OpenMPVersion};
22262226
Word(llvm::omp::getOpenMPDirectiveName(x.v, ompVersion));
22272227
}
2228+
void Unparse(const OmpDimsModifier &x) {
2229+
Word("DIMS");
2230+
Put("(");
2231+
Walk(x.v);
2232+
Put(")");
2233+
}
22282234
void Unparse(const OmpStylizedDeclaration &x) {
22292235
// empty
22302236
}
@@ -2448,6 +2454,21 @@ class UnparseVisitor {
24482454
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
24492455
Walk(std::get<ScalarIntExpr>(x.t));
24502456
}
2457+
void Unparse(const OmpNumTeamsClause &x) {
2458+
using Modifier = OmpNumTeamsClause::Modifier;
2459+
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ":");
2460+
Walk(std::get<std::list<ScalarIntExpr>>(x.t));
2461+
}
2462+
void Unparse(const OmpNumThreadsClause &x) {
2463+
using Modifier = OmpNumThreadsClause::Modifier;
2464+
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ":");
2465+
Walk(std::get<std::list<ScalarIntExpr>>(x.t));
2466+
}
2467+
void Unparse(const OmpThreadLimitClause &x) {
2468+
using Modifier = OmpThreadLimitClause::Modifier;
2469+
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ":");
2470+
Walk(std::get<std::list<ScalarIntExpr>>(x.t));
2471+
}
24512472
void Unparse(const OmpDoacross::Sink &x) {
24522473
Word("SINK: ");
24532474
Walk(x.v.v);

flang/lib/Semantics/check-omp-structure.cpp

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5363,6 +5363,82 @@ void OmpStructureChecker::Enter(const parser::OmpClause::SelfMaps &x) {
53635363
CheckAllowedRequiresClause(llvm::omp::Clause::OMPC_self_maps);
53645364
}
53655365

5366+
void OmpStructureChecker::CheckDimsModifier(parser::CharBlock source,
5367+
size_t numValues, const parser::OmpDimsModifier &x) {
5368+
std::string name{OmpGetDescriptor<parser::OmpDimsModifier>().name.str()};
5369+
5370+
if (auto dimsVal{GetIntValue(x.v)}) {
5371+
if (*dimsVal > 0) {
5372+
if (static_cast<size_t>(*dimsVal) < numValues) {
5373+
context_.Say(source,
5374+
"The %s specifies %d dimensions but %zu values were provided"_err_en_US,
5375+
name, *dimsVal, numValues);
5376+
}
5377+
} else {
5378+
context_.Say(
5379+
source, "The argument to the %s should be positive"_err_en_US, name);
5380+
}
5381+
}
5382+
// The non-constant expression case is diagnosed elsewhere.
5383+
}
5384+
5385+
void OmpStructureChecker::Enter(const parser::OmpClause::NumTeams &x) {
5386+
constexpr auto clauseId{llvm::omp::Clause::OMPC_num_teams};
5387+
CheckAllowedClause(clauseId);
5388+
parser::CharBlock source{GetContext().clauseSource};
5389+
auto &values{std::get<std::list<parser::ScalarIntExpr>>(x.v.t)};
5390+
5391+
if (OmpVerifyModifiers(x.v, clauseId, source, context_)) {
5392+
auto &modifiers{OmpGetModifiers(x.v)};
5393+
if (auto *dims{OmpGetUniqueModifier<parser::OmpDimsModifier>(modifiers)}) {
5394+
CheckDimsModifier(
5395+
OmpGetModifierSource(modifiers, dims), values.size(), *dims);
5396+
}
5397+
}
5398+
5399+
for (auto &val : values) {
5400+
RequiresPositiveParameter(clauseId, val);
5401+
}
5402+
}
5403+
5404+
void OmpStructureChecker::Enter(const parser::OmpClause::NumThreads &x) {
5405+
constexpr auto clauseId{llvm::omp::Clause::OMPC_num_threads};
5406+
CheckAllowedClause(clauseId);
5407+
parser::CharBlock source{GetContext().clauseSource};
5408+
auto &values{std::get<std::list<parser::ScalarIntExpr>>(x.v.t)};
5409+
5410+
if (OmpVerifyModifiers(x.v, clauseId, source, context_)) {
5411+
auto &modifiers{OmpGetModifiers(x.v)};
5412+
if (auto *dims{OmpGetUniqueModifier<parser::OmpDimsModifier>(modifiers)}) {
5413+
CheckDimsModifier(
5414+
OmpGetModifierSource(modifiers, dims), values.size(), *dims);
5415+
}
5416+
}
5417+
5418+
for (auto &val : values) {
5419+
RequiresPositiveParameter(clauseId, val);
5420+
}
5421+
}
5422+
5423+
void OmpStructureChecker::Enter(const parser::OmpClause::ThreadLimit &x) {
5424+
constexpr auto clauseId{llvm::omp::Clause::OMPC_thread_limit};
5425+
CheckAllowedClause(clauseId);
5426+
parser::CharBlock source{GetContext().clauseSource};
5427+
auto &values{std::get<std::list<parser::ScalarIntExpr>>(x.v.t)};
5428+
5429+
if (OmpVerifyModifiers(x.v, clauseId, source, context_)) {
5430+
auto &modifiers{OmpGetModifiers(x.v)};
5431+
if (auto *dims{OmpGetUniqueModifier<parser::OmpDimsModifier>(modifiers)}) {
5432+
CheckDimsModifier(
5433+
OmpGetModifierSource(modifiers, dims), values.size(), *dims);
5434+
}
5435+
}
5436+
5437+
for (auto &val : values) {
5438+
RequiresPositiveParameter(clauseId, val);
5439+
}
5440+
}
5441+
53665442
void OmpStructureChecker::Enter(const parser::OpenMPInteropConstruct &x) {
53675443
bool isDependClauseOccured{false};
53685444
int targetCount{0}, targetSyncCount{0};
@@ -5569,11 +5645,8 @@ CHECK_SIMPLE_CLAUSE(UsesAllocators, OMPC_uses_allocators)
55695645
CHECK_SIMPLE_CLAUSE(Weak, OMPC_weak)
55705646
CHECK_SIMPLE_CLAUSE(Write, OMPC_write)
55715647

5572-
CHECK_REQ_SCALAR_INT_CLAUSE(NumTeams, OMPC_num_teams)
5573-
CHECK_REQ_SCALAR_INT_CLAUSE(NumThreads, OMPC_num_threads)
55745648
CHECK_REQ_SCALAR_INT_CLAUSE(OmpxDynCgroupMem, OMPC_ompx_dyn_cgroup_mem)
55755649
CHECK_REQ_SCALAR_INT_CLAUSE(Priority, OMPC_priority)
5576-
CHECK_REQ_SCALAR_INT_CLAUSE(ThreadLimit, OMPC_thread_limit)
55775650

55785651
CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Collapse, OMPC_collapse)
55795652
CHECK_REQ_CONSTANT_SCALAR_INT_CLAUSE(Safelen, OMPC_safelen)

flang/lib/Semantics/check-omp-structure.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ class OmpStructureChecker : public OmpStructureCheckerBase {
241241
void CheckDependArraySection(
242242
const common::Indirection<parser::ArrayElement> &, const parser::Name &);
243243
void CheckDoacross(const parser::OmpDoacross &doa);
244+
void CheckDimsModifier(parser::CharBlock source, size_t numValues,
245+
const parser::OmpDimsModifier &x);
244246
bool IsDataRefTypeParamInquiry(const parser::DataRef *dataRef);
245247
void CheckVarIsNotPartOfAnotherVar(const parser::CharBlock &source,
246248
const parser::OmpObject &obj, llvm::StringRef clause = "");

0 commit comments

Comments
 (0)