[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