aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flang/include/flang/Parser/openmp-utils.h4
-rw-r--r--flang/include/flang/Parser/parse-tree.h3
-rw-r--r--flang/lib/Parser/openmp-parsers.cpp4
-rw-r--r--flang/lib/Parser/unparse.cpp6
-rw-r--r--flang/lib/Semantics/check-omp-structure.cpp11
-rw-r--r--flang/lib/Semantics/resolve-directives.cpp2
-rw-r--r--flang/test/Parser/OpenMP/requires.f9033
7 files changed, 45 insertions, 18 deletions
diff --git a/flang/include/flang/Parser/openmp-utils.h b/flang/include/flang/Parser/openmp-utils.h
index 77c31b9..b8f3559 100644
--- a/flang/include/flang/Parser/openmp-utils.h
+++ b/flang/include/flang/Parser/openmp-utils.h
@@ -41,7 +41,6 @@ struct ConstructId {
MAKE_CONSTR_ID(OpenMPDeclarativeAllocate, D::OMPD_allocate);
MAKE_CONSTR_ID(OpenMPDeclareReductionConstruct, D::OMPD_declare_reduction);
MAKE_CONSTR_ID(OpenMPExecutableAllocate, D::OMPD_allocate);
-MAKE_CONSTR_ID(OpenMPRequiresConstruct, D::OMPD_requires);
#undef MAKE_CONSTR_ID
@@ -94,8 +93,7 @@ struct DirectiveNameScope {
return std::get<OmpBeginDirective>(x.t).DirName();
} else if constexpr (std::is_same_v<T, OpenMPDeclarativeAllocate> ||
std::is_same_v<T, OpenMPDeclareReductionConstruct> ||
- std::is_same_v<T, OpenMPExecutableAllocate> ||
- std::is_same_v<T, OpenMPRequiresConstruct>) {
+ std::is_same_v<T, OpenMPExecutableAllocate>) {
return MakeName(std::get<Verbatim>(x.t).source, ConstructId<T>::id);
} else {
return GetFromTuple(
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index bd55166..8b23189 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -4991,9 +4991,8 @@ struct OpenMPGroupprivate {
// 2.4 requires -> REQUIRES requires-clause[ [ [,] requires-clause]...]
struct OpenMPRequiresConstruct {
- TUPLE_CLASS_BOILERPLATE(OpenMPRequiresConstruct);
+ WRAPPER_CLASS_BOILERPLATE(OpenMPRequiresConstruct, OmpDirectiveSpecification);
CharBlock source;
- std::tuple<Verbatim, OmpClauseList> t;
};
// 2.15.2 threadprivate -> THREADPRIVATE (variable-name-list)
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 5fd3c17..ea09fe0 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -1836,7 +1836,9 @@ TYPE_PARSER(sourced( //
// 2.4 Requires construct
TYPE_PARSER(sourced(construct<OpenMPRequiresConstruct>(
- verbatim("REQUIRES"_tok), Parser<OmpClauseList>{})))
+ predicated(OmpDirectiveNameParser{},
+ IsDirective(llvm::omp::Directive::OMPD_requires)) >=
+ Parser<OmpDirectiveSpecification>{})))
// 2.15.2 Threadprivate directive
TYPE_PARSER(sourced( //
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index 9812a65..0fbd347 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -2594,10 +2594,10 @@ public:
Put("\n");
EndOpenMP();
}
- void Unparse(const OpenMPRequiresConstruct &y) {
+ void Unparse(const OpenMPRequiresConstruct &x) {
BeginOpenMP();
- Word("!$OMP REQUIRES ");
- Walk(std::get<OmpClauseList>(y.t));
+ Word("!$OMP ");
+ Walk(x.v);
Put("\n");
EndOpenMP();
}
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 9d73b8d..cc2dd0a 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -624,10 +624,6 @@ template <typename Checker> struct DirectiveSpellingVisitor {
checker_(x.v.DirName().source, Directive::OMPD_groupprivate);
return false;
}
- bool Pre(const parser::OpenMPRequiresConstruct &x) {
- checker_(std::get<parser::Verbatim>(x.t).source, Directive::OMPD_requires);
- return false;
- }
bool Pre(const parser::OmpBeginDirective &x) {
checker_(x.DirName().source, x.DirId());
return false;
@@ -1498,14 +1494,13 @@ void OmpStructureChecker::Leave(const parser::OpenMPDepobjConstruct &x) {
}
void OmpStructureChecker::Enter(const parser::OpenMPRequiresConstruct &x) {
- const auto &dir{std::get<parser::Verbatim>(x.t)};
- PushContextAndClauseSets(dir.source, llvm::omp::Directive::OMPD_requires);
+ const auto &dirName{x.v.DirName()};
+ PushContextAndClauseSets(dirName.source, dirName.v);
if (visitedAtomicSource_.empty()) {
return;
}
- const auto &clauseList{std::get<parser::OmpClauseList>(x.t)};
- for (const parser::OmpClause &clause : clauseList.v) {
+ for (const parser::OmpClause &clause : x.v.Clauses().v) {
llvm::omp::Clause id{clause.Id()};
if (id == llvm::omp::Clause::OMPC_atomic_default_mem_order) {
parser::MessageFormattedText txt(
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 7ef211c..a4c8922f 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -523,7 +523,7 @@ public:
// Gather information from the clauses.
Flags flags;
std::optional<common::OmpMemoryOrderType> memOrder;
- for (const auto &clause : std::get<parser::OmpClauseList>(x.t).v) {
+ for (const parser::OmpClause &clause : x.v.Clauses().v) {
flags |= common::visit(
common::visitors{
[&memOrder](
diff --git a/flang/test/Parser/OpenMP/requires.f90 b/flang/test/Parser/OpenMP/requires.f90
new file mode 100644
index 0000000..6cbb06e
--- /dev/null
+++ b/flang/test/Parser/OpenMP/requires.f90
@@ -0,0 +1,33 @@
+!RUN: %flang_fc1 -fdebug-unparse -fopenmp -fopenmp-version=50 %s | FileCheck --ignore-case --check-prefix="UNPARSE" %s
+!RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp -fopenmp-version=50 %s | FileCheck --check-prefix="PARSE-TREE" %s
+
+!$omp requires atomic_default_mem_order(seq_cst)
+
+!UNPARSE: !$OMP REQUIRES ATOMIC_DEFAULT_MEM_ORDER(SEQ_CST)
+
+!PARSE-TREE: OpenMPDeclarativeConstruct -> OpenMPRequiresConstruct -> OmpDirectiveSpecification
+!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = requires
+!PARSE-TREE: | OmpClauseList -> OmpClause -> AtomicDefaultMemOrder -> OmpAtomicDefaultMemOrderClause -> OmpMemoryOrderType = Seq_Cst
+!PARSE-TREE: | Flags = None
+
+!$omp requires unified_shared_memory unified_address
+
+!UNPARSE: !$OMP REQUIRES UNIFIED_SHARED_MEMORY UNIFIED_ADDRESS
+
+!PARSE-TREE: OpenMPDeclarativeConstruct -> OpenMPRequiresConstruct -> OmpDirectiveSpecification
+!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = requires
+!PARSE-TREE: | OmpClauseList -> OmpClause -> UnifiedSharedMemory
+!PARSE-TREE: | OmpClause -> UnifiedAddress
+!PARSE-TREE: | Flags = None
+
+!$omp requires dynamic_allocators reverse_offload
+
+!UNPARSE: !$OMP REQUIRES DYNAMIC_ALLOCATORS REVERSE_OFFLOAD
+
+!PARSE-TREE: OpenMPDeclarativeConstruct -> OpenMPRequiresConstruct -> OmpDirectiveSpecification
+!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = requires
+!PARSE-TREE: | OmpClauseList -> OmpClause -> DynamicAllocators
+!PARSE-TREE: | OmpClause -> ReverseOffload
+!PARSE-TREE: | Flags = None
+
+end