[Openmp-commits] [clang] [llvm] [openmp] [Clang][OpenMP] Validate omp_initial_device omp_invalid_device as device IDs (PR #193688)
Amit Tiwari via Openmp-commits
openmp-commits at lists.llvm.org
Thu Apr 23 07:41:49 PDT 2026
https://github.com/amitamd7 updated https://github.com/llvm/llvm-project/pull/193688
>From 9203852c1554dcd09c3a6c7a0cf77a69d3d6c762 Mon Sep 17 00:00:00 2001
From: amtiwari <amtiwari at amd.com>
Date: Thu, 23 Apr 2026 04:24:11 -0400
Subject: [PATCH 1/2] ID_device_fix
---
.../clang/Basic/DiagnosticSemaKinds.td | 3 +++
clang/lib/Sema/SemaOpenMP.cpp | 26 +++++++++++++++----
offload/include/OpenMP/omp.h | 1 +
openmp/device/include/DeviceTypes.h | 1 +
openmp/runtime/src/include/omp.h.var | 1 +
5 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index cc82bb6a51e52..7a2090089022c 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -12111,6 +12111,9 @@ def note_omp_collapse_ordered_expr : Note<
"as specified in %select{'collapse'|'ordered'|'collapse' and 'ordered'}0 clause%select{||s}0">;
def err_omp_negative_expression_in_clause : Error<
"argument to '%0' clause must be a %select{non-negative|strictly positive}1 integer value">;
+def err_omp_device_expression_invalid : Error<
+ "argument to 'device' clause must be a non-negative integer value, "
+ "'omp_initial_device' (-1), or 'omp_invalid_device' (-2)">;
def err_omp_large_expression_in_clause : Error<
"argument to '%0' clause requires a value that can be represented by a 64-bit">;
def err_omp_not_integral : Error<
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index ec9b2e68ef6cf..756d8d3b6b3df 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -22318,11 +22318,27 @@ OMPClause *SemaOpenMP::ActOnOpenMPDeviceClause(
Expr *ValExpr = Device;
Stmt *HelperValStmt = nullptr;
- // OpenMP [2.9.1, Restrictions]
- // The device expression must evaluate to a non-negative integer value.
- ErrorFound = !isNonNegativeIntegerValue(ValExpr, SemaRef, OMPC_device,
- /*StrictlyPositive=*/false) ||
- ErrorFound;
+ // OpenMP 5.2 [1.3, Execution Model]: a conforming device number is either
+ // a non-negative integer that is less than or equal to omp_get_num_devices()
+ // or equal to omp_initial_device or omp_invalid_device.
+ if (!ValExpr->isTypeDependent() && !ValExpr->isValueDependent() &&
+ !ValExpr->isInstantiationDependent()) {
+ SourceLocation Loc = ValExpr->getExprLoc();
+ ExprResult Value = PerformOpenMPImplicitIntegerConversion(Loc, ValExpr);
+ if (Value.isInvalid()) {
+ ErrorFound = true;
+ } else {
+ ValExpr = Value.get();
+ if (std::optional<llvm::APSInt> Result =
+ ValExpr->getIntegerConstantExpr(getASTContext())) {
+ if (Result->isSigned() && Result->slt(-2)) {
+ Diag(Loc, diag::err_omp_device_expression_invalid)
+ << ValExpr->getSourceRange();
+ ErrorFound = true;
+ }
+ }
+ }
+ }
if (ErrorFound)
return nullptr;
diff --git a/offload/include/OpenMP/omp.h b/offload/include/OpenMP/omp.h
index 8db0a0518dc99..13ba63a91d801 100644
--- a/offload/include/OpenMP/omp.h
+++ b/offload/include/OpenMP/omp.h
@@ -34,6 +34,7 @@ extern "C" {
///{
// See definition in OpenMP (omp.h.var/omp_lib.(F90|h).var)
+#define omp_initial_device -1
#define omp_invalid_device -2
///}
diff --git a/openmp/device/include/DeviceTypes.h b/openmp/device/include/DeviceTypes.h
index 57fb945b5a647..2caf884d7d79e 100644
--- a/openmp/device/include/DeviceTypes.h
+++ b/openmp/device/include/DeviceTypes.h
@@ -22,6 +22,7 @@ template <typename T> using Local = __gpu_local T;
template <typename T> using Global = __gpu_local T;
// See definition in OpenMP (omp.h.var/omp_lib.(F90|h).var)
+#define omp_initial_device -1
#define omp_invalid_device -2
enum omp_proc_bind_t {
diff --git a/openmp/runtime/src/include/omp.h.var b/openmp/runtime/src/include/omp.h.var
index be309727ba090..b05074198ca3f 100644
--- a/openmp/runtime/src/include/omp.h.var
+++ b/openmp/runtime/src/include/omp.h.var
@@ -553,6 +553,7 @@
/* OpenMP 5.2 */
extern int __KAI_KMPC_CONVENTION omp_in_explicit_task(void);
+ #define omp_initial_device -1
#define omp_invalid_device -2
/* OpenMP 6.0 */
>From 9d8f913b1887dfca9e98374631bce6d0d254ed34 Mon Sep 17 00:00:00 2001
From: amtiwari <amtiwari at amd.com>
Date: Thu, 23 Apr 2026 05:05:35 -0400
Subject: [PATCH 2/2] test_updates
---
.../OpenMP/target_data_device_messages.cpp | 4 +-
clang/test/OpenMP/target_device_messages.cpp | 6 +-
.../target_device_omp_initial_invalid.c | 55 +++++++++++++++++++
.../target_enter_data_device_messages.cpp | 4 +-
.../target_exit_data_device_messages.cpp | 4 +-
.../target_parallel_device_messages.cpp | 6 +-
.../target_parallel_for_device_messages.cpp | 6 +-
...rget_parallel_for_simd_device_messages.cpp | 6 +-
.../OpenMP/target_simd_device_messages.cpp | 6 +-
.../OpenMP/target_teams_device_messages.cpp | 6 +-
...arget_teams_distribute_device_messages.cpp | 6 +-
...istribute_parallel_for_device_messages.cpp | 6 +-
...bute_parallel_for_simd_device_messages.cpp | 6 +-
..._teams_distribute_simd_device_messages.cpp | 6 +-
.../OpenMP/target_update_device_messages.cpp | 8 ++-
15 files changed, 120 insertions(+), 15 deletions(-)
create mode 100644 clang/test/OpenMP/target_device_omp_initial_invalid.c
diff --git a/clang/test/OpenMP/target_data_device_messages.cpp b/clang/test/OpenMP/target_data_device_messages.cpp
index f198936c0b316..286686c4727d3 100644
--- a/clang/test/OpenMP/target_data_device_messages.cpp
+++ b/clang/test/OpenMP/target_data_device_messages.cpp
@@ -22,7 +22,9 @@ int main(int argc, char **argv) {
#pragma omp target data map(to: a) device (argc + argc + z)
#pragma omp target data map(to: a) device (argc), device (argc+1) // expected-error {{directive '#pragma omp target data' cannot contain more than one 'device' clause}}
#pragma omp target data map(to: a) device (S1) // expected-error {{'S1' does not refer to a value}}
- #pragma omp target data map(to: a) device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+ #pragma omp target data map(to: a) device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ #pragma omp target data map(to: a) device (-2) // OK: omp_invalid_device
+ #pragma omp target data map(to: a) device (-1) // OK: omp_initial_device
#pragma omp target data map(to: a) device (-10u)
#pragma omp target data map(to: a) device (ancestor: -10u) // expected-error {{use of undeclared identifier 'ancestor'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
#pragma omp target data map(to: a) device (3.14) // expected-error {{expression must have integral or unscoped enumeration type, not 'double'}}
diff --git a/clang/test/OpenMP/target_device_messages.cpp b/clang/test/OpenMP/target_device_messages.cpp
index 8b221856c6fe7..02b9e65fa9609 100644
--- a/clang/test/OpenMP/target_device_messages.cpp
+++ b/clang/test/OpenMP/target_device_messages.cpp
@@ -35,7 +35,11 @@ int main(int argc, char **argv) {
foo();
#pragma omp target device (S1) // expected-error {{'S1' does not refer to a value}}
foo();
- #pragma omp target device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+ #pragma omp target device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ foo();
+ #pragma omp target device (-2) // OK: omp_invalid_device
+ foo();
+ #pragma omp target device (-1) // OK: omp_initial_device
foo();
#pragma omp target device (-10u)
foo();
diff --git a/clang/test/OpenMP/target_device_omp_initial_invalid.c b/clang/test/OpenMP/target_device_omp_initial_invalid.c
new file mode 100644
index 0000000000000..472da001799fa
--- /dev/null
+++ b/clang/test/OpenMP/target_device_omp_initial_invalid.c
@@ -0,0 +1,55 @@
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=52 -ferror-limit 100 %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=52 -ferror-limit 100 %s -Wuninitialized
+// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=60 -ferror-limit 100 %s -Wuninitialized
+
+// expected-no-diagnostics
+
+#define omp_initial_device -1
+#define omp_invalid_device -2
+
+void foo(void) {}
+
+int main(void) {
+ int a = 0;
+
+ // Literal values allowed by the spec for the 'device' clause.
+ #pragma omp target device(-1)
+ foo();
+ #pragma omp target device(-2)
+ foo();
+ #pragma omp target device(0)
+ foo();
+ #pragma omp target device(1)
+ foo();
+
+ // Using the predefined identifiers.
+ #pragma omp target device(omp_initial_device)
+ foo();
+ #pragma omp target device(omp_invalid_device)
+ foo();
+
+ // Also accepted on other target-capable directives.
+ #pragma omp target data map(to: a) device(omp_initial_device)
+ foo();
+ #pragma omp target data map(to: a) device(omp_invalid_device)
+ foo();
+
+ #pragma omp target enter data map(to: a) device(omp_initial_device)
+ #pragma omp target enter data map(to: a) device(omp_invalid_device)
+
+ #pragma omp target exit data map(from: a) device(omp_initial_device)
+ #pragma omp target exit data map(from: a) device(omp_invalid_device)
+
+ #pragma omp target update to(a) device(omp_initial_device)
+ #pragma omp target update to(a) device(omp_invalid_device)
+
+ // Runtime-determined device numbers still pass the semantic check. The
+ // initializer is deliberately -3 (an otherwise-rejected value) to prove
+ // that the check does not fold a non-constant expression to its init; a
+ // value of -1 or -2 here would silently pass for the wrong reason.
+ int dev = -3;
+ #pragma omp target device(dev)
+ foo();
+
+ return 0;
+}
diff --git a/clang/test/OpenMP/target_enter_data_device_messages.cpp b/clang/test/OpenMP/target_enter_data_device_messages.cpp
index 5b657f3d800a0..72ade157d1a31 100644
--- a/clang/test/OpenMP/target_enter_data_device_messages.cpp
+++ b/clang/test/OpenMP/target_enter_data_device_messages.cpp
@@ -22,7 +22,9 @@ int main(int argc, char **argv) {
#pragma omp target enter data map(to: i) device (argc +z + argc )
#pragma omp target enter data map(to: i) device (argc), device (argc+1) // expected-error {{directive '#pragma omp target enter data' cannot contain more than one 'device' clause}}
#pragma omp target enter data map(to: i) device (S1) // expected-error {{'S1' does not refer to a value}}
- #pragma omp target enter data map(to: i) device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+ #pragma omp target enter data map(to: i) device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ #pragma omp target enter data map(to: i) device (-2) // OK: omp_invalid_device
+ #pragma omp target enter data map(to: i) device (-1) // OK: omp_initial_device
#pragma omp target enter data map(to: i) device (-10u)
#pragma omp target enter data map(to: i) device (device_num: -10u) // expected-error {{use of undeclared identifier 'device_num'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
#pragma omp target enter data map(to: i) device (3.14) // expected-error {{expression must have integral or unscoped enumeration type, not 'double'}}
diff --git a/clang/test/OpenMP/target_exit_data_device_messages.cpp b/clang/test/OpenMP/target_exit_data_device_messages.cpp
index c2321043c1f94..00dc7d262a729 100644
--- a/clang/test/OpenMP/target_exit_data_device_messages.cpp
+++ b/clang/test/OpenMP/target_exit_data_device_messages.cpp
@@ -22,7 +22,9 @@ int main(int argc, char **argv) {
#pragma omp target exit data map(from: i) device (argc + argc)
#pragma omp target exit data map(from: i) device (argc), device (argc+1) // expected-error {{directive '#pragma omp target exit data' cannot contain more than one 'device' clause}}
#pragma omp target exit data map(from: i) device (S1) // expected-error {{'S1' does not refer to a value}}
- #pragma omp target exit data map(from: i) device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+ #pragma omp target exit data map(from: i) device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ #pragma omp target exit data map(from: i) device (-2) // OK: omp_invalid_device
+ #pragma omp target exit data map(from: i) device (-1) // OK: omp_initial_device
#pragma omp target exit data map(from: i) device (-10u + z)
#pragma omp target exit data map(from: i) device (ancestor: -10u + z) // expected-error {{use of undeclared identifier 'ancestor'}} expected-error {{expected ')'}} expected-note {{to match this '('}}
#pragma omp target exit data map(from: i) device (3.14) // expected-error {{expression must have integral or unscoped enumeration type, not 'double'}}
diff --git a/clang/test/OpenMP/target_parallel_device_messages.cpp b/clang/test/OpenMP/target_parallel_device_messages.cpp
index 9d5e4ed5567e4..3475caabb196f 100644
--- a/clang/test/OpenMP/target_parallel_device_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
foo();
#pragma omp target parallel device (S1) // expected-error {{'S1' does not refer to a value}}
foo();
- #pragma omp target parallel device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+ #pragma omp target parallel device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ foo();
+ #pragma omp target parallel device (-2) // OK: omp_invalid_device
+ foo();
+ #pragma omp target parallel device (-1) // OK: omp_initial_device
foo();
#pragma omp target parallel device (-10u)
foo();
diff --git a/clang/test/OpenMP/target_parallel_for_device_messages.cpp b/clang/test/OpenMP/target_parallel_for_device_messages.cpp
index 2882c8fc564ba..11dc7efb893f9 100644
--- a/clang/test/OpenMP/target_parallel_for_device_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_for_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for device (S1) // expected-error {{'S1' does not refer to a value}}
for (i = 0; i < argc; ++i) foo();
- #pragma omp target parallel for device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+ #pragma omp target parallel for device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ for (i = 0; i < argc; ++i) foo();
+ #pragma omp target parallel for device (-2) // OK: omp_invalid_device
+ for (i = 0; i < argc; ++i) foo();
+ #pragma omp target parallel for device (-1) // OK: omp_initial_device
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for device (-10u)
for (i = 0; i < argc; ++i) foo();
diff --git a/clang/test/OpenMP/target_parallel_for_simd_device_messages.cpp b/clang/test/OpenMP/target_parallel_for_simd_device_messages.cpp
index a592cac8d5de9..c4fccfc608087 100644
--- a/clang/test/OpenMP/target_parallel_for_simd_device_messages.cpp
+++ b/clang/test/OpenMP/target_parallel_for_simd_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for simd device (S1) // expected-error {{'S1' does not refer to a value}}
for (i = 0; i < argc; ++i) foo();
- #pragma omp target parallel for simd device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+ #pragma omp target parallel for simd device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ for (i = 0; i < argc; ++i) foo();
+ #pragma omp target parallel for simd device (-2) // OK: omp_invalid_device
+ for (i = 0; i < argc; ++i) foo();
+ #pragma omp target parallel for simd device (-1) // OK: omp_initial_device
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for simd device (-10u)
for (i = 0; i < argc; ++i) foo();
diff --git a/clang/test/OpenMP/target_simd_device_messages.cpp b/clang/test/OpenMP/target_simd_device_messages.cpp
index 15bfec132a8e9..f12a46f7602e2 100644
--- a/clang/test/OpenMP/target_simd_device_messages.cpp
+++ b/clang/test/OpenMP/target_simd_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) foo();
#pragma omp target simd device (S1) // expected-error {{'S1' does not refer to a value}}
for (i = 0; i < argc; ++i) foo();
- #pragma omp target simd device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+ #pragma omp target simd device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ for (i = 0; i < argc; ++i) foo();
+ #pragma omp target simd device (-2) // OK: omp_invalid_device
+ for (i = 0; i < argc; ++i) foo();
+ #pragma omp target simd device (-1) // OK: omp_initial_device
for (i = 0; i < argc; ++i) foo();
#pragma omp target simd device (-10u)
for (i = 0; i < argc; ++i) foo();
diff --git a/clang/test/OpenMP/target_teams_device_messages.cpp b/clang/test/OpenMP/target_teams_device_messages.cpp
index 292b6e161aeba..e9d5da5ea28f5 100644
--- a/clang/test/OpenMP/target_teams_device_messages.cpp
+++ b/clang/test/OpenMP/target_teams_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
foo();
#pragma omp target teams device (S1) // expected-error {{'S1' does not refer to a value}}
foo();
-#pragma omp target teams device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+#pragma omp target teams device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ foo();
+#pragma omp target teams device (-2) // OK: omp_invalid_device
+ foo();
+#pragma omp target teams device (-1) // OK: omp_initial_device
foo();
#pragma omp target teams device (-10u)
foo();
diff --git a/clang/test/OpenMP/target_teams_distribute_device_messages.cpp b/clang/test/OpenMP/target_teams_distribute_device_messages.cpp
index a50931d305728..49cce1801b973 100644
--- a/clang/test/OpenMP/target_teams_distribute_device_messages.cpp
+++ b/clang/test/OpenMP/target_teams_distribute_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) foo();
#pragma omp target teams distribute device (S1) // expected-error {{'S1' does not refer to a value}}
for (i = 0; i < argc; ++i) foo();
-#pragma omp target teams distribute device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+#pragma omp target teams distribute device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ for (i = 0; i < argc; ++i) foo();
+#pragma omp target teams distribute device (-2) // OK: omp_invalid_device
+ for (i = 0; i < argc; ++i) foo();
+#pragma omp target teams distribute device (-1) // OK: omp_initial_device
for (i = 0; i < argc; ++i) foo();
#pragma omp target teams distribute device (-10u)
for (i = 0; i < argc; ++i) foo();
diff --git a/clang/test/OpenMP/target_teams_distribute_parallel_for_device_messages.cpp b/clang/test/OpenMP/target_teams_distribute_parallel_for_device_messages.cpp
index e78807a09feec..f30c82445afb1 100644
--- a/clang/test/OpenMP/target_teams_distribute_parallel_for_device_messages.cpp
+++ b/clang/test/OpenMP/target_teams_distribute_parallel_for_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) foo();
#pragma omp target teams distribute parallel for device (S1) // expected-error {{'S1' does not refer to a value}}
for (i = 0; i < argc; ++i) foo();
-#pragma omp target teams distribute parallel for device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+#pragma omp target teams distribute parallel for device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ for (i = 0; i < argc; ++i) foo();
+#pragma omp target teams distribute parallel for device (-2) // OK: omp_invalid_device
+ for (i = 0; i < argc; ++i) foo();
+#pragma omp target teams distribute parallel for device (-1) // OK: omp_initial_device
for (i = 0; i < argc; ++i) foo();
#pragma omp target teams distribute parallel for device (-10u)
for (i = 0; i < argc; ++i) foo();
diff --git a/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_device_messages.cpp b/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_device_messages.cpp
index bd68f36ae0fba..c79a5ba62e806 100644
--- a/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_device_messages.cpp
+++ b/clang/test/OpenMP/target_teams_distribute_parallel_for_simd_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) foo();
#pragma omp target teams distribute parallel for simd device (S1) // expected-error {{'S1' does not refer to a value}}
for (i = 0; i < argc; ++i) foo();
-#pragma omp target teams distribute parallel for simd device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+#pragma omp target teams distribute parallel for simd device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ for (i = 0; i < argc; ++i) foo();
+#pragma omp target teams distribute parallel for simd device (-2) // OK: omp_invalid_device
+ for (i = 0; i < argc; ++i) foo();
+#pragma omp target teams distribute parallel for simd device (-1) // OK: omp_initial_device
for (i = 0; i < argc; ++i) foo();
#pragma omp target teams distribute parallel for simd device (-10u)
for (i = 0; i < argc; ++i) foo();
diff --git a/clang/test/OpenMP/target_teams_distribute_simd_device_messages.cpp b/clang/test/OpenMP/target_teams_distribute_simd_device_messages.cpp
index 993ff49125311..f3998df1524e7 100644
--- a/clang/test/OpenMP/target_teams_distribute_simd_device_messages.cpp
+++ b/clang/test/OpenMP/target_teams_distribute_simd_device_messages.cpp
@@ -31,7 +31,11 @@ int main(int argc, char **argv) {
for (i = 0; i < argc; ++i) foo();
#pragma omp target teams distribute simd device (S1) // expected-error {{'S1' does not refer to a value}}
for (i = 0; i < argc; ++i) foo();
-#pragma omp target teams distribute simd device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+#pragma omp target teams distribute simd device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+ for (i = 0; i < argc; ++i) foo();
+#pragma omp target teams distribute simd device (-2) // OK: omp_invalid_device
+ for (i = 0; i < argc; ++i) foo();
+#pragma omp target teams distribute simd device (-1) // OK: omp_initial_device
for (i = 0; i < argc; ++i) foo();
#pragma omp target teams distribute simd device (-10u)
for (i = 0; i < argc; ++i) foo();
diff --git a/clang/test/OpenMP/target_update_device_messages.cpp b/clang/test/OpenMP/target_update_device_messages.cpp
index 83ce31e2054d1..75aa45193fbea 100644
--- a/clang/test/OpenMP/target_update_device_messages.cpp
+++ b/clang/test/OpenMP/target_update_device_messages.cpp
@@ -25,7 +25,9 @@ int tmain(T argc, S **argv) {
#pragma omp target update from(i) device (argc), device (argc+1) // expected-error {{directive '#pragma omp target update' cannot contain more than one 'device' clause}}
#pragma omp target update from(i) device (S1) // expected-error {{'S1' does not refer to a value}}
#pragma omp target update from(i) device (3.14) // expected-error 2 {{expression must have integral or unscoped enumeration type, not 'double'}}
-#pragma omp target update from(i) device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+#pragma omp target update from(i) device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+#pragma omp target update from(i) device (-2) // OK: omp_invalid_device
+#pragma omp target update from(i) device (-1) // OK: omp_initial_device
}
int main(int argc, char **argv) {
@@ -39,7 +41,9 @@ int main(int argc, char **argv) {
#pragma omp target update to(j) device (z + argc)
#pragma omp target update from(j) device (argc), device (argc+1) // expected-error {{directive '#pragma omp target update' cannot contain more than one 'device' clause}}
#pragma omp target update to(j) device (S1) // expected-error {{'S1' does not refer to a value}}
-#pragma omp target update from(j) device (-2) // expected-error {{argument to 'device' clause must be a non-negative integer value}}
+#pragma omp target update from(j) device (-3) // expected-error {{argument to 'device' clause must be a non-negative integer value, 'omp_initial_device' (-1), or 'omp_invalid_device' (-2)}}
+#pragma omp target update from(j) device (-2) // OK: omp_invalid_device
+#pragma omp target update from(j) device (-1) // OK: omp_initial_device
#pragma omp target update to(j) device (3.14) // expected-error {{expression must have integral or unscoped enumeration type, not 'double'}}
return tmain(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain<int, char>' requested here}}
More information about the Openmp-commits
mailing list