[flang-commits] [flang] [llvm] [Flang][OpenMP]Add parsing support for DISPATCH construct (PR #121982)
Kiran Chandramohan via flang-commits
flang-commits at lists.llvm.org
Sat Jan 25 07:01:43 PST 2025
https://github.com/kiranchandramohan updated https://github.com/llvm/llvm-project/pull/121982
>From cc98fcbe5e8867fd3a5baa85f76f0c782cb5a1b8 Mon Sep 17 00:00:00 2001
From: Mats Petersson <mats.petersson at arm.com>
Date: Thu, 2 Jan 2025 19:48:40 +0000
Subject: [PATCH 1/4] [Flang][OpenMP]Add parsing support for DISPATCH construct
This allows the Flang parser to accept the !$OMP DISPATCH and
related clauses.
Lowering is currently not implemented. Tests for unparse and
parse-tree dump is provided, and one for checking that the
lowering ends in a "not yet implemented"
---
flang/include/flang/Parser/dump-parse-tree.h | 3 ++
flang/include/flang/Parser/parse-tree.h | 29 ++++++++++-
flang/lib/Lower/OpenMP/OpenMP.cpp | 7 +++
flang/lib/Parser/openmp-parsers.cpp | 15 ++++++
flang/lib/Parser/unparse.cpp | 9 ++++
flang/lib/Semantics/check-omp-structure.cpp | 8 +++
flang/lib/Semantics/check-omp-structure.h | 2 +
flang/lib/Semantics/resolve-directives.cpp | 8 +++
flang/test/Lower/OpenMP/Todo/dispatch.f90 | 9 ++++
flang/test/Parser/OpenMP/dispatch.f90 | 51 ++++++++++++++++++++
llvm/include/llvm/Frontend/OpenMP/OMP.td | 1 +
11 files changed, 140 insertions(+), 2 deletions(-)
create mode 100644 flang/test/Lower/OpenMP/Todo/dispatch.f90
create mode 100644 flang/test/Parser/OpenMP/dispatch.f90
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index 11725991e9c9a9..a501ae658a3828 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -679,6 +679,9 @@ class ParseTreeDumper {
NODE_ENUM(common, OmpAtomicDefaultMemOrderType)
NODE(parser, OpenMPDepobjConstruct)
NODE(parser, OpenMPUtilityConstruct)
+ NODE(parser, OpenMPDispatchConstruct)
+ NODE(parser, OmpDispatchDirective)
+ NODE(parser, OmpEndDispatchDirective)
NODE(parser, OpenMPFlushConstruct)
NODE(parser, OpenMPLoopConstruct)
NODE(parser, OpenMPExecutableAllocate)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index 00d85aa05fb3a5..dc20bc2ec155f7 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -4685,6 +4685,31 @@ struct OpenMPDepobjConstruct {
std::tuple<Verbatim, OmpObject, OmpClause> t;
};
+// Ref: [5.2: 200-201]
+//
+// dispatch-construct -> DISPATCH dispatch-clause
+// dispatch-clause -> depend-clause |
+// device-clause |
+// is_device_ptr-clause |
+// nocontext-clause |
+// novariants-clause |
+// nowait-clause
+struct OmpDispatchDirective {
+ TUPLE_CLASS_BOILERPLATE(OmpDispatchDirective);
+ CharBlock source;
+ std::tuple<Verbatim, OmpClauseList> t;
+};
+
+EMPTY_CLASS(OmpEndDispatchDirective);
+
+struct OpenMPDispatchConstruct {
+ TUPLE_CLASS_BOILERPLATE(OpenMPDispatchConstruct);
+ CharBlock source;
+ std::tuple<OmpDispatchDirective, Block,
+ std::optional<OmpEndDispatchDirective>>
+ t;
+};
+
// 2.17.8 flush -> FLUSH [memory-order-clause] [(variable-name-list)]
struct OpenMPFlushConstruct {
TUPLE_CLASS_BOILERPLATE(OpenMPFlushConstruct);
@@ -4757,8 +4782,8 @@ struct OpenMPConstruct {
UNION_CLASS_BOILERPLATE(OpenMPConstruct);
std::variant<OpenMPStandaloneConstruct, OpenMPSectionsConstruct,
OpenMPSectionConstruct, OpenMPLoopConstruct, OpenMPBlockConstruct,
- OpenMPAtomicConstruct, OpenMPDeclarativeAllocate, OpenMPUtilityConstruct,
- OpenMPExecutableAllocate, OpenMPAllocatorsConstruct,
+ OpenMPAtomicConstruct, OpenMPDeclarativeAllocate, OpenMPDispatchConstruct,
+ OpenMPUtilityConstruct, OpenMPExecutableAllocate, OpenMPAllocatorsConstruct,
OpenMPCriticalConstruct>
u;
};
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 1434bcd6330e02..8cceb42bec63e0 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -3388,6 +3388,13 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
TODO(converter.getCurrentLocation(), "OpenMPUtilityConstruct");
}
+static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
+ semantics::SemanticsContext &semaCtx,
+ lower::pft::Evaluation &eval,
+ const parser::OpenMPDispatchConstruct &) {
+ TODO(converter.getCurrentLocation(), "OpenMPDispatchConstruct");
+}
+
static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
semantics::SemanticsContext &semaCtx,
lower::pft::Evaluation &eval,
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 5ff91da082c852..aa2fec01bc640c 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -740,11 +740,15 @@ TYPE_PARSER(
"MERGEABLE" >> construct<OmpClause>(construct<OmpClause::Mergeable>()) ||
"MESSAGE" >> construct<OmpClause>(construct<OmpClause::Message>(
parenthesized(Parser<OmpMessageClause>{}))) ||
+ "NOCONTEXT" >> construct<OmpClause>(construct<OmpClause::Nocontext>(
+ parenthesized(scalarLogicalExpr))) ||
"NOGROUP" >> construct<OmpClause>(construct<OmpClause::Nogroup>()) ||
"NONTEMPORAL" >> construct<OmpClause>(construct<OmpClause::Nontemporal>(
parenthesized(nonemptyList(name)))) ||
"NOTINBRANCH" >>
construct<OmpClause>(construct<OmpClause::Notinbranch>()) ||
+ "NOVARIANTS" >> construct<OmpClause>(construct<OmpClause::Novariants>(
+ parenthesized(scalarLogicalExpr))) ||
"NOWAIT" >> construct<OmpClause>(construct<OmpClause::Nowait>()) ||
"NUM_TASKS" >> construct<OmpClause>(construct<OmpClause::NumTasks>(
parenthesized(Parser<OmpNumTasksClause>{}))) ||
@@ -1119,6 +1123,16 @@ TYPE_PARSER(sourced(construct<OmpCriticalDirective>(verbatim("CRITICAL"_tok),
TYPE_PARSER(construct<OpenMPCriticalConstruct>(
Parser<OmpCriticalDirective>{}, block, Parser<OmpEndCriticalDirective>{}))
+TYPE_PARSER(sourced(construct<OmpDispatchDirective>(
+ verbatim("DISPATCH"_tok), Parser<OmpClauseList>{})))
+
+TYPE_PARSER(
+ construct<OmpEndDispatchDirective>(startOmpLine >> "END DISPATCH"_tok))
+
+TYPE_PARSER(sourced(construct<OpenMPDispatchConstruct>(
+ Parser<OmpDispatchDirective>{} / endOmpLine, block,
+ maybe(Parser<OmpEndDispatchDirective>{} / endOmpLine))))
+
// 2.11.3 Executable Allocate directive
TYPE_PARSER(
sourced(construct<OpenMPExecutableAllocate>(verbatim("ALLOCATE"_tok),
@@ -1219,6 +1233,7 @@ TYPE_CONTEXT_PARSER("OpenMP construct"_en_US,
construct<OpenMPConstruct>(Parser<OpenMPStandaloneConstruct>{}),
construct<OpenMPConstruct>(Parser<OpenMPAtomicConstruct>{}),
construct<OpenMPConstruct>(Parser<OpenMPUtilityConstruct>{}),
+ construct<OpenMPConstruct>(Parser<OpenMPDispatchConstruct>{}),
construct<OpenMPConstruct>(Parser<OpenMPExecutableAllocate>{}),
construct<OpenMPConstruct>(Parser<OpenMPAllocatorsConstruct>{}),
construct<OpenMPConstruct>(Parser<OpenMPDeclarativeAllocate>{}),
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index 7bf404bba2c3e4..5b1ff07382c4d8 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -2725,6 +2725,15 @@ class UnparseVisitor {
Walk(x.v);
return false;
}
+ void Unparse(const OmpDispatchDirective &x) {
+ Word("!$OMP DISPATCH");
+ Walk(x.t);
+ Put("\n");
+ }
+ void Unparse(const OmpEndDispatchDirective &) {
+ Word("!$OMP END DISPATCH");
+ Put("\n");
+ }
void Unparse(const OmpErrorDirective &x) {
Word("!$OMP ERROR ");
Walk(x.t);
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index d3f2d3fd2f9dcc..c96eb8d4baa6dd 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -1748,6 +1748,14 @@ void OmpStructureChecker::Enter(const parser::OmpErrorDirective &x) {
PushContextAndClauseSets(dir.source, llvm::omp::Directive::OMPD_error);
}
+void OmpStructureChecker::Enter(const parser::OpenMPDispatchConstruct &x) {
+ PushContextAndClauseSets(x.source, llvm::omp::Directive::OMPD_dispatch);
+}
+
+void OmpStructureChecker::Leave(const parser::OpenMPDispatchConstruct &x) {
+ dirContext_.pop_back();
+}
+
void OmpStructureChecker::Leave(const parser::OmpErrorDirective &x) {
dirContext_.pop_back();
}
diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index dc360957c873b7..2b8304cb170372 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -105,6 +105,8 @@ class OmpStructureChecker
void Enter(const parser::OmpDeclareTargetWithList &);
void Enter(const parser::OmpDeclareTargetWithClause &);
void Leave(const parser::OmpDeclareTargetWithClause &);
+ void Enter(const parser::OpenMPDispatchConstruct &);
+ void Leave(const parser::OpenMPDispatchConstruct &);
void Enter(const parser::OmpErrorDirective &);
void Leave(const parser::OmpErrorDirective &);
void Enter(const parser::OpenMPExecutableAllocate &);
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index ea102371334a69..4e6d819f545a2d 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -441,6 +441,9 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor<llvm::omp::Directive> {
bool Pre(const parser::OpenMPDeclarativeAllocate &);
void Post(const parser::OpenMPDeclarativeAllocate &) { PopContext(); }
+ bool Pre(const parser::OpenMPDispatchConstruct &);
+ void Post(const parser::OpenMPDispatchConstruct &) { PopContext(); }
+
bool Pre(const parser::OpenMPExecutableAllocate &);
void Post(const parser::OpenMPExecutableAllocate &);
@@ -1976,6 +1979,11 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclarativeAllocate &x) {
return false;
}
+bool OmpAttributeVisitor::Pre(const parser::OpenMPDispatchConstruct &x) {
+ PushContext(x.source, llvm::omp::Directive::OMPD_dispatch);
+ return true;
+}
+
bool OmpAttributeVisitor::Pre(const parser::OpenMPExecutableAllocate &x) {
PushContext(x.source, llvm::omp::Directive::OMPD_allocate);
const auto &list{std::get<std::optional<parser::OmpObjectList>>(x.t)};
diff --git a/flang/test/Lower/OpenMP/Todo/dispatch.f90 b/flang/test/Lower/OpenMP/Todo/dispatch.f90
new file mode 100644
index 00000000000000..8800bd420e4623
--- /dev/null
+++ b/flang/test/Lower/OpenMP/Todo/dispatch.f90
@@ -0,0 +1,9 @@
+! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -fopenmp-version=51 -o - %s 2>&1 | FileCheck %s
+
+! CHECK: not yet implemented: OpenMPDispatchConstruct
+program p
+ integer r
+ r = 1
+!$omp dispatch nowait
+ print *,r
+end program p
diff --git a/flang/test/Parser/OpenMP/dispatch.f90 b/flang/test/Parser/OpenMP/dispatch.f90
new file mode 100644
index 00000000000000..5511b774125119
--- /dev/null
+++ b/flang/test/Parser/OpenMP/dispatch.f90
@@ -0,0 +1,51 @@
+! RUN: %flang_fc1 %openmp_flags -fdebug-dump-parse-tree %s | FileCheck %s
+! RUN: %flang_fc1 %openmp_flags -fdebug-unparse %s | FileCheck %s --check-prefix="UNPARSE"
+
+integer function func(a, b, c)
+ integer :: a, b, c
+ func = a + b + c
+end function func
+
+subroutine sub(x)
+ use iso_c_binding
+ integer :: func
+ integer :: r
+ type(c_ptr) :: x
+ integer :: a = 14, b = 7, c = 21
+!UNPARSE: !$OMP DISPATCH DEVICE(3_4) NOWAIT NOCONTEXT(.false._4) NOVARIANTS(.true._4)
+!CHECK: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPDispatchConstruct
+!CHECK-NEXT: | | | OmpDispatchDirective
+!CHECK: | | | | OmpClauseList -> OmpClause -> Device -> OmpDeviceClause
+!CHECK-NEXT: | | | | | Scalar -> Integer -> Expr = '3_4'
+!CHECK-NEXT: | | | | | | LiteralConstant -> IntLiteralConstant = '3'
+!CHECK-NEXT: | | | | OmpClause -> Nowait
+!CHECK-NEXT: | | | | OmpClause -> Nocontext -> Scalar -> Logical -> Expr = '.false._4'
+!CHECK-NEXT: | | | | | LiteralConstant -> LogicalLiteralConstant
+!CHECK-NEXT: | | | | | | bool = 'false'
+!CHECK-NEXT: | | | | OmpClause -> Novariants -> Scalar -> Logical -> Expr = '.true._4'
+!CHECK-NEXT: | | | | | EQ
+!CHECK-NEXT: | | | | | | Expr = '1_4'
+!CHECK-NEXT: | | | | | | | LiteralConstant -> IntLiteralConstant = '1'
+!CHECK-NEXT: | | | | | | Expr = '1_4'
+!CHECK-NEXT: | | | | | | | LiteralConstant -> IntLiteralConstant = '1'
+!CHECK-NEXT: | | | Block
+
+ !$omp dispatch device(3) nowait nocontext(.false.) novariants(1.eq.1)
+ r = func(a, b, c)
+!UNPARSE: !$OMP END DISPATCH
+!CHECK: | | | OmpEndDispatchDirective
+ !$omp end dispatch
+
+!! Test the "no end dispatch" option.
+!UNPARSE: !$OMP DISPATCH DEVICE(3_4) IS_DEVICE_PTR(x)
+!CHECK: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPDispatchConstruct
+!CHECK-NEXT: | | | OmpDispatchDirective
+!CHECK: | | | | OmpClause -> IsDevicePtr -> OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
+ !$omp dispatch device(3) is_device_ptr(x)
+ r = func(a+1, b+2, c+3)
+!CHECK-NOT: | | | OmpEndDispatchDirective
+
+end subroutine sub
+
+
+
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index a4c1964c3e88f5..b6db5db93d9bd2 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -321,6 +321,7 @@ def OMPC_Novariants : Clause<"novariants"> {
}
def OMPC_NoWait : Clause<"nowait"> {
let clangClass = "OMPNowaitClause";
+ let clangClass = "OmpNowaitClause";
}
def OMP_NUMTASKS_Strict : ClauseVal<"strict", 1, 1> {}
def OMP_NUMTASKS_Unknown : ClauseVal<"unknown", 2, 0> { let isDefault = 1; }
>From c5b9f4fea871c6818613c51c5d25cf2a5b8e7c72 Mon Sep 17 00:00:00 2001
From: Kiran Chandramohan <kiran.chandramohan at arm.com>
Date: Fri, 24 Jan 2025 18:14:25 +0000
Subject: [PATCH 2/4] Address review comments and compilation failure
---
flang/lib/Lower/OpenMP/OpenMP.cpp | 3 +++
flang/lib/Semantics/check-omp-structure.cpp | 22 +++++++++++++++++++
flang/test/Lower/OpenMP/Todo/dispatch.f90 | 5 ++++-
flang/test/Semantics/OpenMP/dispatch.f90 | 24 +++++++++++++++++++++
llvm/include/llvm/Frontend/OpenMP/OMP.td | 1 -
5 files changed, 53 insertions(+), 2 deletions(-)
create mode 100644 flang/test/Semantics/OpenMP/dispatch.f90
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 8cceb42bec63e0..7c8d292e90f011 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -381,6 +381,9 @@ extractOmpDirective(const parser::OpenMPConstruct &ompConstruct) {
[](const parser::OpenMPDeclarativeAllocate &c) {
return llvm::omp::OMPD_allocate;
},
+ [](const parser::OpenMPDispatchConstruct &c) {
+ return llvm::omp::OMPD_dispatch;
+ },
[](const parser::OpenMPExecutableAllocate &c) {
return llvm::omp::OMPD_allocate;
},
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index c96eb8d4baa6dd..e14a5a35fb13e5 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -1750,6 +1750,28 @@ void OmpStructureChecker::Enter(const parser::OmpErrorDirective &x) {
void OmpStructureChecker::Enter(const parser::OpenMPDispatchConstruct &x) {
PushContextAndClauseSets(x.source, llvm::omp::Directive::OMPD_dispatch);
+ const auto &block{std::get<parser::Block>(x.t)};
+ if (block.empty() || block.size() > 1) {
+ context_.Say(x.source,
+ "The DISPATCH construct is empty or contains more than one statement"_err_en_US);
+ return;
+ }
+
+ auto it{block.begin()};
+ bool passChecks{false};
+ if (const parser::AssignmentStmt *assignStmt{
+ parser::Unwrap<parser::AssignmentStmt>(*it)}) {
+ if (parser::Unwrap<parser::FunctionReference>(assignStmt->t)) {
+ passChecks = true;
+ }
+ } else if (parser::Unwrap<parser::CallStmt>(*it)) {
+ passChecks = true;
+ }
+
+ if (!passChecks) {
+ context_.Say(x.source,
+ "The DISPATCH construct does not contain a SUBROUTINE or FUNCTION"_err_en_US);
+ }
}
void OmpStructureChecker::Leave(const parser::OpenMPDispatchConstruct &x) {
diff --git a/flang/test/Lower/OpenMP/Todo/dispatch.f90 b/flang/test/Lower/OpenMP/Todo/dispatch.f90
index 8800bd420e4623..380dfa14eaae1e 100644
--- a/flang/test/Lower/OpenMP/Todo/dispatch.f90
+++ b/flang/test/Lower/OpenMP/Todo/dispatch.f90
@@ -5,5 +5,8 @@ program p
integer r
r = 1
!$omp dispatch nowait
- print *,r
+ call foo()
+contains
+ subroutine foo
+ end subroutine
end program p
diff --git a/flang/test/Semantics/OpenMP/dispatch.f90 b/flang/test/Semantics/OpenMP/dispatch.f90
new file mode 100644
index 00000000000000..7dfbeecb2fc1d5
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/dispatch.f90
@@ -0,0 +1,24 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+
+subroutine sb1
+ integer :: r
+ r = 1
+ !ERROR: The DISPATCH construct does not contain a SUBROUTINE or FUNCTION
+ !$omp dispatch nowait
+ print *,r
+end subroutine
+subroutine sb2
+ integer :: r
+!ERROR: The DISPATCH construct is empty or contains more than one statement
+ !$omp dispatch
+ call foo()
+ r = bar()
+ !$omp end dispatch
+contains
+ subroutine foo
+ end subroutine foo
+ function bar
+ integer :: bar
+ bar = 2
+ end function
+end subroutine
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index b6db5db93d9bd2..a4c1964c3e88f5 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -321,7 +321,6 @@ def OMPC_Novariants : Clause<"novariants"> {
}
def OMPC_NoWait : Clause<"nowait"> {
let clangClass = "OMPNowaitClause";
- let clangClass = "OmpNowaitClause";
}
def OMP_NUMTASKS_Strict : ClauseVal<"strict", 1, 1> {}
def OMP_NUMTASKS_Unknown : ClauseVal<"unknown", 2, 0> { let isDefault = 1; }
>From bf43b245f92d1ae5f045f3899252fc66f17a6363 Mon Sep 17 00:00:00 2001
From: Kiran Chandramohan <kiran.chandramohan at arm.com>
Date: Fri, 24 Jan 2025 18:59:15 +0000
Subject: [PATCH 3/4] Format changes
---
flang/include/flang/Parser/parse-tree.h | 4 ++--
flang/lib/Semantics/check-omp-structure.cpp | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index dc20bc2ec155f7..78962db8a84de8 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -4783,8 +4783,8 @@ struct OpenMPConstruct {
std::variant<OpenMPStandaloneConstruct, OpenMPSectionsConstruct,
OpenMPSectionConstruct, OpenMPLoopConstruct, OpenMPBlockConstruct,
OpenMPAtomicConstruct, OpenMPDeclarativeAllocate, OpenMPDispatchConstruct,
- OpenMPUtilityConstruct, OpenMPExecutableAllocate, OpenMPAllocatorsConstruct,
- OpenMPCriticalConstruct>
+ OpenMPUtilityConstruct, OpenMPExecutableAllocate,
+ OpenMPAllocatorsConstruct, OpenMPCriticalConstruct>
u;
};
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index e14a5a35fb13e5..c7ad9cc085a213 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -1759,8 +1759,8 @@ void OmpStructureChecker::Enter(const parser::OpenMPDispatchConstruct &x) {
auto it{block.begin()};
bool passChecks{false};
- if (const parser::AssignmentStmt *assignStmt{
- parser::Unwrap<parser::AssignmentStmt>(*it)}) {
+ if (const parser::AssignmentStmt *
+ assignStmt{parser::Unwrap<parser::AssignmentStmt>(*it)}) {
if (parser::Unwrap<parser::FunctionReference>(assignStmt->t)) {
passChecks = true;
}
>From 7820ef27e1a844b5868675023cd26d552b31ca3f Mon Sep 17 00:00:00 2001
From: Kiran Chandramohan <kiran.chandramohan at arm.com>
Date: Sat, 25 Jan 2025 15:00:52 +0000
Subject: [PATCH 4/4] Add openmp flags directly
---
flang/test/Parser/OpenMP/dispatch.f90 | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/flang/test/Parser/OpenMP/dispatch.f90 b/flang/test/Parser/OpenMP/dispatch.f90
index 5511b774125119..98cd6090334f3d 100644
--- a/flang/test/Parser/OpenMP/dispatch.f90
+++ b/flang/test/Parser/OpenMP/dispatch.f90
@@ -1,5 +1,5 @@
-! RUN: %flang_fc1 %openmp_flags -fdebug-dump-parse-tree %s | FileCheck %s
-! RUN: %flang_fc1 %openmp_flags -fdebug-unparse %s | FileCheck %s --check-prefix="UNPARSE"
+! RUN: %flang_fc1 -fopenmp -fdebug-dump-parse-tree %s | FileCheck %s
+! RUN: %flang_fc1 -fopenmp -fdebug-unparse %s | FileCheck %s --check-prefix="UNPARSE"
integer function func(a, b, c)
integer :: a, b, c
More information about the flang-commits
mailing list