@@ -153,6 +153,9 @@ static TypeDeclarationStmt makeIterSpecDecl(std::list<ObjectName> &&names) {
153153 makeEntityList(std::move(names)));
154154}
155155
156+ TYPE_PARSER(sourced(construct<OmpDirectiveSpecification>(
157+ OmpDirectiveNameParser{}, maybe(indirect(Parser<OmpClauseList>{})))))
158+
156159// --- Parsers for context traits -------------------------------------
157160
158161static std::string nameToString(Name &&name) { return name.ToString(); }
@@ -501,6 +504,9 @@ TYPE_PARSER(sourced(construct<OmpToClause::Modifier>(
501504 construct<OmpToClause::Modifier>(Parser<OmpMapper>{}) ||
502505 construct<OmpToClause::Modifier>(Parser<OmpIterator>{})))))
503506
507+ TYPE_PARSER(sourced(construct<OmpWhenClause::Modifier>( //
508+ Parser<OmpContextSelector>{})))
509+
504510// --- Parsers for clauses --------------------------------------------
505511
506512/// `MOBClause` is a clause that has a
@@ -527,13 +533,18 @@ TYPE_PARSER(construct<OmpAffinityClause>(
527533 Parser<OmpObjectList>{}))
528534
529535// 2.15.3.1 DEFAULT (PRIVATE | FIRSTPRIVATE | SHARED | NONE)
530- TYPE_PARSER(construct<OmpDefaultClause>(
536+ TYPE_PARSER(construct<OmpDefaultClause::DataSharingAttribute >(
531537 "PRIVATE" >> pure(OmpDefaultClause::DataSharingAttribute::Private) ||
532538 "FIRSTPRIVATE" >>
533539 pure(OmpDefaultClause::DataSharingAttribute::Firstprivate) ||
534540 "SHARED" >> pure(OmpDefaultClause::DataSharingAttribute::Shared) ||
535541 "NONE" >> pure(OmpDefaultClause::DataSharingAttribute::None)))
536542
543+ TYPE_PARSER(construct<OmpDefaultClause>(
544+ construct<OmpDefaultClause>(
545+ Parser<OmpDefaultClause::DataSharingAttribute>{}) ||
546+ construct<OmpDefaultClause>(Parser<OmpDirectiveSpecification>{})))
547+
537548// 2.5 PROC_BIND (MASTER | CLOSE | PRIMARY | SPREAD)
538549TYPE_PARSER(construct<OmpProcBindClause>(
539550 "CLOSE" >> pure(OmpProcBindClause::AffinityPolicy::Close) ||
@@ -698,6 +709,16 @@ TYPE_PARSER(construct<OmpOrderClause>(
698709 maybe(nonemptyList(Parser<OmpOrderClause::Modifier>{}) / ":"),
699710 "CONCURRENT" >> pure(OmpOrderClause::Ordering::Concurrent)))
700711
712+ TYPE_PARSER(construct<OmpMatchClause>(
713+ Parser<traits::OmpContextSelectorSpecification>{}))
714+
715+ TYPE_PARSER(construct<OmpOtherwiseClause>(
716+ maybe(sourced(Parser<OmpDirectiveSpecification>{}))))
717+
718+ TYPE_PARSER(construct<OmpWhenClause>(
719+ maybe(nonemptyList(Parser<OmpWhenClause::Modifier>{}) / ":"),
720+ maybe(sourced(Parser<OmpDirectiveSpecification>{}))))
721+
701722// OMP 5.2 12.6.1 grainsize([ prescriptiveness :] scalar-integer-expression)
702723TYPE_PARSER(construct<OmpGrainsizeClause>(
703724 maybe(nonemptyList(Parser<OmpGrainsizeClause::Modifier>{}) / ":"),
@@ -815,6 +836,8 @@ TYPE_PARSER(
815836 parenthesized(Parser<OmpObjectList>{}))) ||
816837 "MAP" >> construct<OmpClause>(construct<OmpClause::Map>(
817838 parenthesized(Parser<OmpMapClause>{}))) ||
839+ "MATCH" >> construct<OmpClause>(construct<OmpClause::Match>(
840+ parenthesized(Parser<OmpMatchClause>{}))) ||
818841 "MERGEABLE" >> construct<OmpClause>(construct<OmpClause::Mergeable>()) ||
819842 "MESSAGE" >> construct<OmpClause>(construct<OmpClause::Message>(
820843 parenthesized(Parser<OmpMessageClause>{}))) ||
@@ -839,6 +862,8 @@ TYPE_PARSER(
839862 parenthesized(Parser<OmpOrderClause>{}))) ||
840863 "ORDERED" >> construct<OmpClause>(construct<OmpClause::Ordered>(
841864 maybe(parenthesized(scalarIntConstantExpr)))) ||
865+ "OTHERWISE" >> construct<OmpClause>(construct<OmpClause::Otherwise>(
866+ maybe(parenthesized(Parser<OmpOtherwiseClause>{})))) ||
842867 "PARTIAL" >> construct<OmpClause>(construct<OmpClause::Partial>(
843868 maybe(parenthesized(scalarIntConstantExpr)))) ||
844869 "PRIORITY" >> construct<OmpClause>(construct<OmpClause::Priority>(
@@ -894,7 +919,9 @@ TYPE_PARSER(
894919 parenthesized(nonemptyList(name)))) ||
895920 "UNTIED" >> construct<OmpClause>(construct<OmpClause::Untied>()) ||
896921 "UPDATE" >> construct<OmpClause>(construct<OmpClause::Update>(
897- parenthesized(Parser<OmpUpdateClause>{}))))
922+ parenthesized(Parser<OmpUpdateClause>{}))) ||
923+ "WHEN" >> construct<OmpClause>(construct<OmpClause::When>(
924+ parenthesized(Parser<OmpWhenClause>{}))))
898925
899926// [Clause, [Clause], ...]
900927TYPE_PARSER(sourced(construct<OmpClauseList>(
@@ -914,6 +941,9 @@ TYPE_PARSER(sourced(construct<OpenMPUtilityConstruct>(
914941 sourced(construct<OpenMPUtilityConstruct>(
915942 sourced(Parser<OmpNothingDirective>{}))))))
916943
944+ TYPE_PARSER(sourced(construct<OmpMetadirectiveDirective>(
945+ "METADIRECTIVE" >> Parser<OmpClauseList>{})))
946+
917947// Omp directives enclosing do loop
918948TYPE_PARSER(sourced(construct<OmpLoopDirective>(first(
919949 "DISTRIBUTE PARALLEL DO SIMD" >>
@@ -1059,6 +1089,8 @@ TYPE_PARSER(
10591089 construct<OpenMPStandaloneConstruct>(Parser<OpenMPCancelConstruct>{}) ||
10601090 construct<OpenMPStandaloneConstruct>(
10611091 Parser<OpenMPCancellationPointConstruct>{}) ||
1092+ construct<OpenMPStandaloneConstruct>(
1093+ Parser<OmpMetadirectiveDirective>{}) ||
10621094 construct<OpenMPStandaloneConstruct>(Parser<OpenMPDepobjConstruct>{})) /
10631095 endOfLine)
10641096
0 commit comments