[flang-commits] [flang] [flang][OpenMP] Add semantic check for declare target (PR #71425)
via flang-commits
flang-commits at lists.llvm.org
Mon Nov 6 10:33:06 PST 2023
https://github.com/shraiysh created https://github.com/llvm/llvm-project/pull/71425
This patch adds a semantic check for the following:
```
If a list item is a procedure name, it must not be a generic name,
procedure pointer, entry name, or statement function name.
```
>From 975296755451b064df79b75202b1262189fd5a25 Mon Sep 17 00:00:00 2001
From: Shraiysh Vaishay <shraiysh.vaishay at amd.com>
Date: Sun, 5 Nov 2023 14:27:04 -0600
Subject: [PATCH] [flang][OpenMP] Add semantic check for declare target
This patch adds a semantic check for the following:
```
If a list item is a procedure name, it must not be a generic name,
procedure pointer, entry name, or statement function name.
```
---
flang/lib/Semantics/check-omp-structure.cpp | 30 +++++++++++++++
flang/lib/Semantics/check-omp-structure.h | 1 +
.../Semantics/OpenMP/declare-target07.f90 | 38 +++++++++++++++++++
3 files changed, 69 insertions(+)
create mode 100644 flang/test/Semantics/OpenMP/declare-target07.f90
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 2054a13bd92e790..85265c768891bdd 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -1173,6 +1173,36 @@ void OmpStructureChecker::Enter(const parser::OpenMPDeclareTargetConstruct &x) {
}
}
+void OmpStructureChecker::Enter(const parser::OmpDeclareTargetWithList &x) {
+ SymbolSourceMap symbols;
+ GetSymbolsInObjectList(x.v, symbols);
+ for (auto &[symbol, source] : symbols) {
+ const GenericDetails *genericDetails = symbol->detailsIf<GenericDetails>();
+ if (genericDetails) {
+ context_.Say(source,
+ "The procedure '%s' in DECLARE TARGET construct cannot be a generic name"_err_en_US,
+ symbol->name());
+ genericDetails->specific();
+ }
+ if(IsProcedurePointer(*symbol)) {
+ context_.Say(source,
+ "The procedure '%s' in DECLARE TARGET construct cannot be a procedure pointer"_err_en_US,
+ symbol->name());
+ }
+ const SubprogramDetails *entryDetails = symbol->detailsIf<SubprogramDetails>();
+ if(entryDetails && entryDetails->entryScope()) {
+ context_.Say(source,
+ "The procedure '%s' in DECLARE TARGET construct cannot be an entry name"_err_en_US,
+ symbol->name());
+ }
+ if(IsStmtFunction(*symbol)) {
+ context_.Say(source,
+ "The procedure '%s' in DECLARE TARGET construct cannot be a statement function"_err_en_US,
+ symbol->name());
+ }
+ }
+}
+
void OmpStructureChecker::CheckSymbolNames(
const parser::CharBlock &source, const parser::OmpObjectList &objList) {
for (const auto &ompObject : objList.v) {
diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index 0adfa7b5d83874d..d35602cca75d549 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -79,6 +79,7 @@ class OmpStructureChecker
void Leave(const parser::OpenMPDeclarativeAllocate &);
void Enter(const parser::OpenMPDeclareTargetConstruct &);
void Leave(const parser::OpenMPDeclareTargetConstruct &);
+ void Enter(const parser::OmpDeclareTargetWithList &);
void Enter(const parser::OpenMPExecutableAllocate &);
void Leave(const parser::OpenMPExecutableAllocate &);
void Enter(const parser::OpenMPAllocatorsConstruct &);
diff --git a/flang/test/Semantics/OpenMP/declare-target07.f90 b/flang/test/Semantics/OpenMP/declare-target07.f90
new file mode 100644
index 000000000000000..5645a31aa1e8a92
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/declare-target07.f90
@@ -0,0 +1,38 @@
+! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
+
+module my_module
+ interface foo
+ subroutine foo_int(a)
+ integer :: a
+ end subroutine
+ subroutine foo_real(a)
+ real :: a
+ end subroutine
+ end interface
+contains
+ subroutine bar(N)
+ integer :: N
+ entry entry1(N)
+ end subroutine
+ subroutine foobar(N)
+ integer::N
+ !ERROR: The procedure 'entry1' in DECLARE TARGET construct cannot be an entry name
+ !$omp declare target(bar, entry1)
+ call bar(N)
+ end subroutine
+end module
+
+subroutine baz(x)
+ real, intent(inout) :: x
+ real :: res
+ stmtfunc(x) = 4.0 * (x**3)
+ !ERROR: The procedure 'stmtfunc' in DECLARE TARGET construct cannot be a statement function
+ !$omp declare target (stmtfunc)
+ res = stmtfunc(x)
+end subroutine
+
+program main
+ use my_module
+ !ERROR: The procedure 'foo' in DECLARE TARGET construct cannot be a generic name
+ !$omp declare target(foo)
+end
More information about the flang-commits
mailing list