[flang-commits] [flang] [flang][OpenMP] Add semantic check for device clause (PR #72789)
via flang-commits
flang-commits at lists.llvm.org
Sat Nov 18 23:27:01 PST 2023
https://github.com/shraiysh created https://github.com/llvm/llvm-project/pull/72789
This patch adds the following semantic check:
```
The ancestor device-modifier must not appear on the device clause on any
directive other than the target construct.
```
>From 854b24c6c827837fff0cafae2a217ecc980a299f Mon Sep 17 00:00:00 2001
From: Shraiysh Vaishay <shraiysh.vaishay at amd.com>
Date: Sun, 19 Nov 2023 01:24:07 -0600
Subject: [PATCH] [flang][OpenMP] Add semantic check for device clause
This patch adds the following semantic check:
```
The ancestor device-modifier must not appear on the device clause on any
directive other than the target construct.
```
---
flang/lib/Semantics/check-omp-structure.cpp | 12 +++++++
.../test/Semantics/OpenMP/device-clause01.f90 | 31 +++++++++++++++++++
2 files changed, 43 insertions(+)
create mode 100644 flang/test/Semantics/OpenMP/device-clause01.f90
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 0b1a581bf298196..a79ff19915476e8 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -8,8 +8,10 @@
#include "check-omp-structure.h"
#include "definable.h"
+#include "flang/Parser/characters.h"
#include "flang/Parser/parse-tree.h"
#include "flang/Semantics/tools.h"
+#include "llvm/Frontend/OpenMP/OMP.h.inc"
namespace Fortran::semantics {
@@ -2748,6 +2750,16 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Device &x) {
const auto &device{std::get<1>(deviceClause.t)};
RequiresPositiveParameter(
llvm::omp::Clause::OMPC_device, device, "device expression");
+ auto modifier = std::get<0>(x.v.t);
+ if (modifier.has_value() &&
+ modifier.value() == parser::OmpDeviceClause::DeviceModifier::Ancestor) {
+ if(GetContext().directive != llvm::omp::OMPD_target) {
+ context_.Say(GetContext().clauseSource,
+ "The ANCESTOR device-modifier must not appear on the DEVICE clause on"
+ " any directive other than the TARGET construct. Found on %s construct."_err_en_US,
+ parser::ToUpperCaseLetters(getDirectiveName(GetContext().directive)));
+ }
+ }
}
void OmpStructureChecker::Enter(const parser::OmpClause::Depend &x) {
diff --git a/flang/test/Semantics/OpenMP/device-clause01.f90 b/flang/test/Semantics/OpenMP/device-clause01.f90
new file mode 100644
index 000000000000000..6f95d162790d575
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/device-clause01.f90
@@ -0,0 +1,31 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+! OpenMP Version 5.2
+! 13.2 Device clause
+
+subroutine foo
+
+ integer :: a
+
+ !$omp target device(ancestor:0)
+ !$omp end target
+ !$omp target device(device_num:0)
+ !$omp end target
+
+ !ERROR: The ANCESTOR device-modifier must not appear on the DEVICE clause on any directive other than the TARGET construct. Found on TARGET DATA construct.
+ !$omp target data device(ancestor:0) map(tofrom:a)
+ !$omp end target data
+ !$omp target data device(device_num:0) map(tofrom:a)
+ !$omp end target data
+
+
+ !ERROR: The ANCESTOR device-modifier must not appear on the DEVICE clause on any directive other than the TARGET construct. Found on TARGET ENTER DATA construct.
+ !$omp target enter data device(ancestor:0) map(to:a)
+ !$omp target exit data map(from:a)
+ !$omp target enter data device(device_num:0) map(to:a)
+ !$omp target exit data map(from:a)
+
+ !ERROR: The ANCESTOR device-modifier must not appear on the DEVICE clause on any directive other than the TARGET construct. Found on TARGET UPDATE construct.
+ !$omp target update device(ancestor:0) to(a)
+ !$omp target update device(device_num:0) to(a)
+
+end subroutine foo
More information about the flang-commits
mailing list