Skip to content

Commit 0509659

Browse files
authored
[flang][OpenMP] Use new modifiers with AFFINITY/ALIGNED/DEVICE (#117786)
This is a mostly mechanical change from specific modifiers embedded directly in a clause to the Modifier variant. Additional comments and references to the OpenMP specs were added.
1 parent fed07a0 commit 0509659

File tree

13 files changed

+157
-64
lines changed

13 files changed

+157
-64
lines changed

flang/examples/FeatureList/FeatureList.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,8 +523,9 @@ struct NodeVisitor {
523523
READ_FEATURE(OmpScheduleClause)
524524
READ_FEATURE(OmpScheduleClause::Kind)
525525
READ_FEATURE(OmpScheduleClause::Modifier)
526+
READ_FEATURE(OmpDeviceModifier)
526527
READ_FEATURE(OmpDeviceClause)
527-
READ_FEATURE(OmpDeviceClause::DeviceModifier)
528+
READ_FEATURE(OmpDeviceClause::Modifier)
528529
READ_FEATURE(OmpDeviceTypeClause)
529530
READ_FEATURE(OmpDeviceTypeClause::DeviceTypeDescription)
530531
READ_FEATURE(OmpChunkModifier)

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,10 @@ class ParseTreeDumper {
484484
NODE(parser, OmpIteratorSpecifier)
485485
NODE(parser, OmpIterator)
486486
NODE(parser, OmpAffinityClause)
487+
NODE(OmpAffinityClause, Modifier)
488+
NODE(parser, OmpAlignment)
487489
NODE(parser, OmpAlignedClause)
490+
NODE(OmpAlignedClause, Modifier)
488491
NODE(parser, OmpAtomic)
489492
NODE(parser, OmpAtomicCapture)
490493
NODE(OmpAtomicCapture, Stmt1)
@@ -596,7 +599,9 @@ class ParseTreeDumper {
596599
NODE(OmpScheduleClause, Modifier)
597600
NODE_ENUM(OmpScheduleClause, Kind)
598601
NODE(parser, OmpDeviceClause)
599-
NODE_ENUM(OmpDeviceClause, DeviceModifier)
602+
NODE(OmpDeviceClause, Modifier)
603+
NODE(parser, OmpDeviceModifier)
604+
NODE_ENUM(OmpDeviceModifier, Value)
600605
NODE(parser, OmpDeviceTypeClause)
601606
NODE_ENUM(OmpDeviceTypeClause, DeviceTypeDescription)
602607
NODE(parser, OmpUpdateClause)

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

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3457,6 +3457,14 @@ inline namespace modifier {
34573457
// ENUM_CLASS(Value, Keyword1, Keyword2);
34583458
// };
34593459

3460+
// Ref: [4.5:72-81], [5.0:110-119], [5.1:134-143], [5.2:169-170]
3461+
//
3462+
// alignment ->
3463+
// scalar-integer-expression // since 4.5
3464+
struct OmpAlignment {
3465+
WRAPPER_CLASS_BOILERPLATE(OmpAlignment, ScalarIntExpr);
3466+
};
3467+
34603468
// Ref: [5.1:184-185], [5.2:178-179]
34613469
//
34623470
// align-modifier ->
@@ -3526,6 +3534,15 @@ struct OmpDependenceType {
35263534
WRAPPER_CLASS_BOILERPLATE(OmpDependenceType, Value);
35273535
};
35283536

3537+
// Ref: [5.0:170-176], [5.1:197-205], [5.2:276-277]
3538+
//
3539+
// device-modifier ->
3540+
// ANCESTOR | DEVICE_NUM // since 5.0
3541+
struct OmpDeviceModifier {
3542+
ENUM_CLASS(Value, Ancestor, Device_Num)
3543+
WRAPPER_CLASS_BOILERPLATE(OmpDeviceModifier, Value);
3544+
};
3545+
35293546
// Ref: [5.1:205-209], [5.2:166-168]
35303547
//
35313548
// motion-modifier ->
@@ -3656,18 +3673,26 @@ struct OmpVariableCategory {
36563673

36573674
// --- Clauses
36583675

3659-
// OMP 5.0 2.10.1 affinity([aff-modifier:] locator-list)
3660-
// aff-modifier: interator-modifier
3676+
// Ref: [5.0:135-140], [5.1:161-166], [5.2:264-265]
3677+
//
3678+
// affinity-clause ->
3679+
// AFFINITY([aff-modifier:] locator-list) // since 5.0
3680+
// aff-modifier ->
3681+
// interator-modifier // since 5.0
36613682
struct OmpAffinityClause {
36623683
TUPLE_CLASS_BOILERPLATE(OmpAffinityClause);
3663-
std::tuple<std::optional<OmpIterator>, OmpObjectList> t;
3684+
MODIFIER_BOILERPLATE(OmpIterator);
3685+
std::tuple<MODIFIERS(), OmpObjectList> t;
36643686
};
36653687

3666-
// 2.8.1 aligned-clause -> ALIGNED (variable-name-list[ : scalar-constant])
3688+
// Ref: [4.5:72-81], [5.0:110-119], [5.1:134-143], [5.2:169-170]
3689+
//
3690+
// aligned-clause ->
3691+
// ALIGNED(list [: alignment]) // since 4.5
36673692
struct OmpAlignedClause {
36683693
TUPLE_CLASS_BOILERPLATE(OmpAlignedClause);
3669-
CharBlock source;
3670-
std::tuple<OmpObjectList, std::optional<ScalarIntConstantExpr>> t;
3694+
MODIFIER_BOILERPLATE(OmpAlignment);
3695+
std::tuple<OmpObjectList, MODIFIERS()> t;
36713696
};
36723697

36733698
// Ref: [5.0:158-159], [5.1:184-185], [5.2:178-179]
@@ -3806,8 +3831,8 @@ WRAPPER_CLASS(OmpDoacrossClause, OmpDoacross);
38063831
// Ref: [5.0:254-255], [5.1:287-288], [5.2:73]
38073832
//
38083833
// destroy-clause ->
3809-
// DESTROY | // since 5.0, until 5.2
3810-
// DESTROY(variable) // since 5.2
3834+
// DESTROY | // since 5.0, until 5.1
3835+
// DESTROY(variable) // since 5.2
38113836
WRAPPER_CLASS(OmpDestroyClause, OmpObject);
38123837

38133838
// Ref: [5.0:135-140], [5.1:161-166], [5.2:265-266]
@@ -3826,8 +3851,8 @@ struct OmpDetachClause {
38263851
// scalar-integer-expression) // since 5.0
38273852
struct OmpDeviceClause {
38283853
TUPLE_CLASS_BOILERPLATE(OmpDeviceClause);
3829-
ENUM_CLASS(DeviceModifier, Ancestor, Device_Num)
3830-
std::tuple<std::optional<DeviceModifier>, ScalarIntExpr> t;
3854+
MODIFIER_BOILERPLATE(OmpDeviceModifier);
3855+
std::tuple<MODIFIERS(), ScalarIntExpr> t;
38313856
};
38323857

38333858
// Ref: [5.0:180-185], [5.1:210-216], [5.2:275]

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,13 @@ template <typename SpecificTy> const OmpModifierDescriptor &OmpGetDescriptor();
6767
#define DECLARE_DESCRIPTOR(name) \
6868
template <> const OmpModifierDescriptor &OmpGetDescriptor<name>()
6969

70+
DECLARE_DESCRIPTOR(parser::OmpAlignment);
7071
DECLARE_DESCRIPTOR(parser::OmpAlignModifier);
7172
DECLARE_DESCRIPTOR(parser::OmpAllocatorComplexModifier);
7273
DECLARE_DESCRIPTOR(parser::OmpAllocatorSimpleModifier);
7374
DECLARE_DESCRIPTOR(parser::OmpChunkModifier);
7475
DECLARE_DESCRIPTOR(parser::OmpDependenceType);
76+
DECLARE_DESCRIPTOR(parser::OmpDeviceModifier);
7577
DECLARE_DESCRIPTOR(parser::OmpExpectation);
7678
DECLARE_DESCRIPTOR(parser::OmpIterator);
7779
DECLARE_DESCRIPTOR(parser::OmpLinearModifier);

flang/lib/Lower/OpenMP/Clauses.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -384,11 +384,12 @@ Absent make(const parser::OmpClause::Absent &inp,
384384
Affinity make(const parser::OmpClause::Affinity &inp,
385385
semantics::SemanticsContext &semaCtx) {
386386
// inp.v -> parser::OmpAffinityClause
387-
auto &t0 = std::get<std::optional<parser::OmpIterator>>(inp.v.t);
387+
auto &mods = semantics::OmpGetModifiers(inp.v);
388+
auto *m0 = semantics::OmpGetUniqueModifier<parser::OmpIterator>(mods);
388389
auto &t1 = std::get<parser::OmpObjectList>(inp.v.t);
389390

390391
auto &&maybeIter =
391-
maybeApply([&](auto &&s) { return makeIterator(s, semaCtx); }, t0);
392+
m0 ? makeIterator(*m0, semaCtx) : std::optional<Iterator>{};
392393

393394
return Affinity{{/*Iterator=*/std::move(maybeIter),
394395
/*LocatorList=*/makeObjects(t1, semaCtx)}};
@@ -403,11 +404,12 @@ Align make(const parser::OmpClause::Align &inp,
403404
Aligned make(const parser::OmpClause::Aligned &inp,
404405
semantics::SemanticsContext &semaCtx) {
405406
// inp.v -> parser::OmpAlignedClause
407+
auto &mods = semantics::OmpGetModifiers(inp.v);
406408
auto &t0 = std::get<parser::OmpObjectList>(inp.v.t);
407-
auto &t1 = std::get<std::optional<parser::ScalarIntConstantExpr>>(inp.v.t);
409+
auto *m1 = semantics::OmpGetUniqueModifier<parser::OmpAlignment>(mods);
408410

409411
return Aligned{{
410-
/*Alignment=*/maybeApply(makeExprFn(semaCtx), t1),
412+
/*Alignment=*/maybeApplyToV(makeExprFn(semaCtx), m1),
411413
/*List=*/makeObjects(t0, semaCtx),
412414
}};
413415
}
@@ -659,18 +661,18 @@ Detach make(const parser::OmpClause::Detach &inp,
659661
Device make(const parser::OmpClause::Device &inp,
660662
semantics::SemanticsContext &semaCtx) {
661663
// inp.v -> parser::OmpDeviceClause
662-
using wrapped = parser::OmpDeviceClause;
663-
664664
CLAUSET_ENUM_CONVERT( //
665-
convert, parser::OmpDeviceClause::DeviceModifier, Device::DeviceModifier,
665+
convert, parser::OmpDeviceModifier::Value, Device::DeviceModifier,
666666
// clang-format off
667667
MS(Ancestor, Ancestor)
668668
MS(Device_Num, DeviceNum)
669669
// clang-format on
670670
);
671-
auto &t0 = std::get<std::optional<wrapped::DeviceModifier>>(inp.v.t);
671+
672+
auto &mods = semantics::OmpGetModifiers(inp.v);
673+
auto *m0 = semantics::OmpGetUniqueModifier<parser::OmpDeviceModifier>(mods);
672674
auto &t1 = std::get<parser::ScalarIntExpr>(inp.v.t);
673-
return Device{{/*DeviceModifier=*/maybeApply(convert, t0),
675+
return Device{{/*DeviceModifier=*/maybeApplyToV(convert, m0),
674676
/*DeviceDescription=*/makeExpr(t1, semaCtx)}};
675677
}
676678

flang/lib/Parser/openmp-parsers.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ static TypeDeclarationStmt makeIterSpecDecl(std::list<ObjectName> &&names) {
9191

9292
// --- Parsers for clause modifiers -----------------------------------
9393

94+
TYPE_PARSER(construct<OmpAlignment>(scalarIntExpr))
95+
9496
TYPE_PARSER(construct<OmpAlignModifier>( //
9597
"ALIGN" >> parenthesized(scalarIntExpr)))
9698

@@ -106,6 +108,10 @@ TYPE_PARSER(construct<OmpDependenceType>(
106108
"SINK" >> pure(OmpDependenceType::Value::Sink) ||
107109
"SOURCE" >> pure(OmpDependenceType::Value::Source)))
108110

111+
TYPE_PARSER(construct<OmpDeviceModifier>(
112+
"ANCESTOR" >> pure(OmpDeviceModifier::Value::Ancestor) ||
113+
"DEVICE_NUM" >> pure(OmpDeviceModifier::Value::Device_Num)))
114+
109115
TYPE_PARSER(construct<OmpExpectation>( //
110116
"PRESENT" >> pure(OmpExpectation::Value::Present)))
111117

@@ -191,6 +197,12 @@ TYPE_PARSER(construct<OmpVariableCategory>(
191197
"SCALAR" >> pure(OmpVariableCategory::Value::Scalar)))
192198

193199
// This could be auto-generated.
200+
TYPE_PARSER(
201+
sourced(construct<OmpAffinityClause::Modifier>(Parser<OmpIterator>{})))
202+
203+
TYPE_PARSER(
204+
sourced(construct<OmpAlignedClause::Modifier>(Parser<OmpAlignment>{})))
205+
194206
TYPE_PARSER(sourced(construct<OmpAllocateClause::Modifier>(sourced(
195207
construct<OmpAllocateClause::Modifier>(Parser<OmpAlignModifier>{}) ||
196208
construct<OmpAllocateClause::Modifier>(
@@ -201,6 +213,9 @@ TYPE_PARSER(sourced(construct<OmpAllocateClause::Modifier>(sourced(
201213
TYPE_PARSER(sourced(
202214
construct<OmpDefaultmapClause::Modifier>(Parser<OmpVariableCategory>{})))
203215

216+
TYPE_PARSER(
217+
sourced(construct<OmpDeviceClause::Modifier>(Parser<OmpDeviceModifier>{})))
218+
204219
TYPE_PARSER(sourced(construct<OmpFromClause::Modifier>(
205220
sourced(construct<OmpFromClause::Modifier>(Parser<OmpExpectation>{}) ||
206221
construct<OmpFromClause::Modifier>(Parser<OmpMapper>{}) ||
@@ -251,7 +266,8 @@ static inline MOBClause makeMobClause(
251266
// [5.0] 2.10.1 affinity([aff-modifier:] locator-list)
252267
// aff-modifier: interator-modifier
253268
TYPE_PARSER(construct<OmpAffinityClause>(
254-
maybe(Parser<OmpIterator>{} / ":"), Parser<OmpObjectList>{}))
269+
maybe(nonemptyList(Parser<OmpAffinityClause::Modifier>{}) / ":"),
270+
Parser<OmpObjectList>{}))
255271

256272
// 2.15.3.1 DEFAULT (PRIVATE | FIRSTPRIVATE | SHARED | NONE)
257273
TYPE_PARSER(construct<OmpDefaultClause>(
@@ -304,10 +320,7 @@ TYPE_PARSER(construct<OmpScheduleClause>(
304320

305321
// device([ device-modifier :] scalar-integer-expression)
306322
TYPE_PARSER(construct<OmpDeviceClause>(
307-
maybe(
308-
("ANCESTOR" >> pure(OmpDeviceClause::DeviceModifier::Ancestor) ||
309-
"DEVICE_NUM" >> pure(OmpDeviceClause::DeviceModifier::Device_Num)) /
310-
":"),
323+
maybe(nonemptyList(Parser<OmpDeviceClause::Modifier>{}) / ":"),
311324
scalarIntExpr))
312325

313326
// device_type(any | host | nohost)
@@ -401,8 +414,8 @@ TYPE_CONTEXT_PARSER("Omp LINEAR clause"_en_US,
401414
TYPE_PARSER(construct<OmpDetachClause>(Parser<OmpObject>{}))
402415

403416
// 2.8.1 ALIGNED (list: alignment)
404-
TYPE_PARSER(construct<OmpAlignedClause>(
405-
Parser<OmpObjectList>{}, maybe(":" >> scalarIntConstantExpr)))
417+
TYPE_PARSER(construct<OmpAlignedClause>(Parser<OmpObjectList>{},
418+
maybe(":" >> nonemptyList(Parser<OmpAlignedClause::Modifier>{}))))
406419

407420
TYPE_PARSER(construct<OmpUpdateClause>(
408421
construct<OmpUpdateClause>(Parser<OmpDependenceType>{}) ||

flang/lib/Parser/unparse.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2107,17 +2107,19 @@ class UnparseVisitor {
21072107
Walk(",", std::get<std::optional<ScalarIntExpr>>(x.t));
21082108
}
21092109
void Unparse(const OmpDeviceClause &x) {
2110-
Walk(std::get<std::optional<OmpDeviceClause::DeviceModifier>>(x.t), ":");
2110+
using Modifier = OmpDeviceClause::Modifier;
2111+
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
21112112
Walk(std::get<ScalarIntExpr>(x.t));
21122113
}
21132114
void Unparse(const OmpAffinityClause &x) {
2114-
Walk(std::get<std::optional<OmpIterator>>(x.t), ":");
2115+
using Modifier = OmpAffinityClause::Modifier;
2116+
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
21152117
Walk(std::get<OmpObjectList>(x.t));
21162118
}
21172119
void Unparse(const OmpAlignedClause &x) {
2120+
using Modifier = OmpAlignedClause::Modifier;
21182121
Walk(std::get<OmpObjectList>(x.t));
2119-
Put(",");
2120-
Walk(std::get<std::optional<ScalarIntConstantExpr>>(x.t));
2122+
Walk(": ", std::get<std::optional<std::list<Modifier>>>(x.t));
21212123
}
21222124
void Unparse(const OmpFromClause &x) {
21232125
using Modifier = OmpFromClause::Modifier;
@@ -2842,7 +2844,7 @@ class UnparseVisitor {
28422844
WALK_NESTED_ENUM(OmpOrderingModifier, Value) // OMP ordering-modifier
28432845
WALK_NESTED_ENUM(OmpTaskDependenceType, Value) // OMP task-dependence-type
28442846
WALK_NESTED_ENUM(OmpScheduleClause, Kind) // OMP schedule-kind
2845-
WALK_NESTED_ENUM(OmpDeviceClause, DeviceModifier) // OMP device modifier
2847+
WALK_NESTED_ENUM(OmpDeviceModifier, Value) // OMP device modifier
28462848
WALK_NESTED_ENUM(
28472849
OmpDeviceTypeClause, DeviceTypeDescription) // OMP device_type
28482850
WALK_NESTED_ENUM(OmpReductionModifier, Value) // OMP reduction-modifier

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

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3399,10 +3399,15 @@ void OmpStructureChecker::Leave(const parser::OmpAtomic &) {
33993399
// generalized restrictions.
34003400
void OmpStructureChecker::Enter(const parser::OmpClause::Aligned &x) {
34013401
CheckAllowedClause(llvm::omp::Clause::OMPC_aligned);
3402-
3403-
if (const auto &expr{
3404-
std::get<std::optional<parser::ScalarIntConstantExpr>>(x.v.t)}) {
3405-
RequiresConstantPositiveParameter(llvm::omp::Clause::OMPC_aligned, *expr);
3402+
if (OmpVerifyModifiers(
3403+
x.v, llvm::omp::OMPC_aligned, GetContext().clauseSource, context_)) {
3404+
auto &modifiers{OmpGetModifiers(x.v)};
3405+
if (auto *align{OmpGetUniqueModifier<parser::OmpAlignment>(modifiers)}) {
3406+
if (const auto &v{GetIntValue(align->v)}; !v || *v <= 0) {
3407+
context_.Say(OmpGetModifierSource(modifiers, align),
3408+
"The alignment value should be a constant positive integer"_err_en_US);
3409+
}
3410+
}
34063411
}
34073412
// 2.8.1 TODO: list-item attribute check
34083413
}
@@ -3624,19 +3629,25 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Schedule &x) {
36243629

36253630
void OmpStructureChecker::Enter(const parser::OmpClause::Device &x) {
36263631
CheckAllowedClause(llvm::omp::Clause::OMPC_device);
3627-
const parser::OmpDeviceClause &deviceClause = x.v;
3628-
const auto &device{std::get<1>(deviceClause.t)};
3632+
const parser::OmpDeviceClause &deviceClause{x.v};
3633+
const auto &device{std::get<parser::ScalarIntExpr>(deviceClause.t)};
36293634
RequiresPositiveParameter(
36303635
llvm::omp::Clause::OMPC_device, device, "device expression");
3631-
std::optional<parser::OmpDeviceClause::DeviceModifier> modifier =
3632-
std::get<0>(deviceClause.t);
3633-
if (modifier &&
3634-
*modifier == parser::OmpDeviceClause::DeviceModifier::Ancestor) {
3635-
if (GetContext().directive != llvm::omp::OMPD_target) {
3636-
context_.Say(GetContext().clauseSource,
3637-
"The ANCESTOR device-modifier must not appear on the DEVICE clause on"
3638-
" any directive other than the TARGET construct. Found on %s construct."_err_en_US,
3639-
parser::ToUpperCaseLetters(getDirectiveName(GetContext().directive)));
3636+
llvm::omp::Directive dir{GetContext().directive};
3637+
3638+
if (OmpVerifyModifiers(deviceClause, llvm::omp::OMPC_device,
3639+
GetContext().clauseSource, context_)) {
3640+
auto &modifiers{OmpGetModifiers(deviceClause)};
3641+
3642+
if (auto *deviceMod{
3643+
OmpGetUniqueModifier<parser::OmpDeviceModifier>(modifiers)}) {
3644+
using Value = parser::OmpDeviceModifier::Value;
3645+
if (dir != llvm::omp::OMPD_target && deviceMod->v == Value::Ancestor) {
3646+
auto name{OmpGetDescriptor<parser::OmpDeviceModifier>().name};
3647+
context_.Say(OmpGetModifierSource(modifiers, deviceMod),
3648+
"The ANCESTOR %s must not appear on the DEVICE clause on any directive other than the TARGET construct. Found on %s construct."_err_en_US,
3649+
name.str(), parser::ToUpperCaseLetters(getDirectiveName(dir)));
3650+
}
36403651
}
36413652
}
36423653
}

flang/lib/Semantics/openmp-modifiers.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,22 @@ unsigned OmpModifierDescriptor::since(llvm::omp::Clause id) const {
7474
// Note: The intent for these functions is to have them be automatically-
7575
// generated in the future.
7676

77+
template <>
78+
const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlignment>() {
79+
static const OmpModifierDescriptor desc{
80+
/*name=*/"alignment",
81+
/*props=*/
82+
{
83+
{45, {OmpProperty::Unique, OmpProperty::Ultimate, OmpProperty::Post}},
84+
},
85+
/*clauses=*/
86+
{
87+
{45, {Clause::OMPC_aligned}},
88+
},
89+
};
90+
return desc;
91+
}
92+
7793
template <>
7894
const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlignModifier>() {
7995
static const OmpModifierDescriptor desc{
@@ -158,6 +174,22 @@ const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDependenceType>() {
158174
return desc;
159175
}
160176

177+
template <>
178+
const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDeviceModifier>() {
179+
static const OmpModifierDescriptor desc{
180+
/*name=*/"device-modifier",
181+
/*props=*/
182+
{
183+
{45, {OmpProperty::Unique}},
184+
},
185+
/*clauses=*/
186+
{
187+
{45, {Clause::OMPC_device}},
188+
},
189+
};
190+
return desc;
191+
}
192+
161193
template <>
162194
const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpExpectation>() {
163195
static const OmpModifierDescriptor desc{

0 commit comments

Comments
 (0)