[Openmp-commits] [clang] [llvm] [openmp] [Clang][OpenMP] Validate omp_initial_device omp_invalid_device as device IDs (PR #193688)

via Openmp-commits openmp-commits at lists.llvm.org
Thu Apr 23 01:31:19 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-offload

Author: Amit Tiwari (amitamd7)

<details>
<summary>Changes</summary>

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)
                              ^~~~~~~~~~~~~~~~~~
```

---

Patch is 23.86 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/193688.diff


20 Files Affected:

- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+3) 
- (modified) clang/lib/Sema/SemaOpenMP.cpp (+21-5) 
- (modified) clang/test/OpenMP/target_data_device_messages.cpp (+3-1) 
- (modified) clang/test/OpenMP/target_device_messages.cpp (+5-1) 
- (added) clang/test/OpenMP/target_device_omp_initial_invalid.c (+51) 
- (modified) clang/test/OpenMP/target_enter_data_device_messages.cpp (+3-1) 
- (modified) clang/test/OpenMP/target_exit_data_device_messages.cpp (+3-1) 
- (modified) clang/test/OpenMP/target_parallel_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_parallel_for_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_parallel_for_simd_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_simd_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_teams_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_teams_distribute_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_simd_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_teams_distribute_simd_device_messages.cpp (+5-1) 
- (modified) clang/test/OpenMP/target_update_device_messages.cpp (+6-2) 
- (modified) offload/include/OpenMP/omp.h (+1) 
- (modified) openmp/device/include/DeviceTypes.h (+1) 
- (modified) openmp/runtime/src/include/omp.h.var (+1) 


``````````diff
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/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 ...
[truncated]

``````````

</details>


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


More information about the Openmp-commits mailing list