[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 01:30:44 PDT 2026


https://github.com/amitamd7 created https://github.com/llvm/llvm-project/pull/193688

The counterpart fix for clang (as too done here: [flang-fix](https://github.com/llvm/llvm-project/pull/193669))

The incorrectly interpreted device values in the `target` directive throws:
 
```
 error: argument to 'device' clause must be a non-negative integer value
    #pragma omp target device(-1)
                              ^~
error: argument to 'device' clause must be a non-negative integer value
    #pragma omp target device(omp_invalid_device)
                              ^~~~~~~~~~~~~~~~~~
```

>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 7dbdb635389d255e2ed083a4148c5d243a7e6ea1 Mon Sep 17 00:00:00 2001
From: amtiwari <amtiwari at amd.com>
Date: Thu, 23 Apr 2026 04:24:41 -0400
Subject: [PATCH 2/2] tests_updates

---
 .../OpenMP/target_data_device_messages.cpp    |  4 +-
 clang/test/OpenMP/target_device_messages.cpp  |  6 ++-
 .../target_device_omp_initial_invalid.c       | 51 +++++++++++++++++++
 .../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, 116 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..acf560f2aa778
--- /dev/null
+++ b/clang/test/OpenMP/target_device_omp_initial_invalid.c
@@ -0,0 +1,51 @@
+// 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
+
+#include <omp.h>
+
+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 from omp.h.
+  #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 (no compile-time check).
+  int dev = -1;
+  #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