-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[flang][OpenMP] Add semantic check for declare target #71425
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-flang-semantics @llvm/pr-subscribers-flang-openmp Author: Shraiysh (shraiysh) ChangesThis patch adds a semantic check for the following:
Full diff: https://github.com/llvm/llvm-project/pull/71425.diff 3 Files Affected:
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
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, aside from the slight formatting complaint by the tool!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
9752967
to
139e242
Compare
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. ```
139e242
to
72bf7ea
Compare
This patch adds a semantic check for the following: