diff options
author | Amr Hesham <amr96@programmer.net> | 2025-05-12 21:34:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-12 21:34:35 +0200 |
commit | a4186bd04bca16a23769d9461e4b0fc1c7a03f53 (patch) | |
tree | 9b09f3929e7aa3e4d0d91699b874c121387b98a9 | |
parent | 39b04335ef3021399f8c0dc43837a45537b62e54 (diff) | |
download | llvm-a4186bd04bca16a23769d9461e4b0fc1c7a03f53.zip llvm-a4186bd04bca16a23769d9461e4b0fc1c7a03f53.tar.gz llvm-a4186bd04bca16a23769d9461e4b0fc1c7a03f53.tar.bz2 |
[clang][OpenMP] Add error for large expr in collapse clause (#138592)
Report error when OpenMP collapse clause has an expression that can't be
represented in 64-bit
Issue #138445
-rw-r--r-- | clang/docs/ReleaseNotes.rst | 3 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 7 | ||||
-rw-r--r-- | clang/test/OpenMP/for_collapse_messages.cpp | 2 | ||||
-rw-r--r-- | clang/test/OpenMP/for_ordered_clause.cpp | 3 | ||||
-rw-r--r-- | clang/test/OpenMP/for_simd_collapse_messages.cpp | 2 | ||||
-rw-r--r-- | clang/test/OpenMP/for_simd_loop_messages.cpp | 3 | ||||
-rw-r--r-- | clang/test/OpenMP/masked_taskloop_collapse_messages.cpp | 2 | ||||
-rw-r--r-- | clang/test/OpenMP/masked_taskloop_simd_collapse_messages.cpp | 2 | ||||
-rw-r--r-- | clang/test/OpenMP/simd_collapse_messages.cpp | 2 |
10 files changed, 28 insertions, 0 deletions
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 14d526a..fb03181 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -521,6 +521,9 @@ Improvements to Clang's diagnostics - Fixed a duplicate diagnostic when performing typo correction on function template calls with explicit template arguments. (#GH139226) +- An error is now emitted when OpenMP ``collapse`` and ``ordered`` clauses have an + argument larger than what can fit within a 64-bit integer. + Improvements to Clang's time-trace ---------------------------------- diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index ca47cf6..3efe959 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11526,6 +11526,8 @@ 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_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< "expression must have integral or unscoped enumeration " "type, not %0">; diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 9d02594..be6ce97 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -15944,6 +15944,13 @@ ExprResult SemaOpenMP::VerifyPositiveIntegerConstantInClause( << E->getSourceRange(); return ExprError(); } + + if (!Result.isRepresentableByInt64()) { + Diag(E->getExprLoc(), diag::err_omp_large_expression_in_clause) + << getOpenMPClauseNameForDiag(CKind) << E->getSourceRange(); + return ExprError(); + } + if (CKind == OMPC_collapse && DSAStack->getAssociatedLoops() == 1) DSAStack->setAssociatedLoops(Result.getExtValue()); else if (CKind == OMPC_ordered) diff --git a/clang/test/OpenMP/for_collapse_messages.cpp b/clang/test/OpenMP/for_collapse_messages.cpp index 07630ff..147536e 100644 --- a/clang/test/OpenMP/for_collapse_messages.cpp +++ b/clang/test/OpenMP/for_collapse_messages.cpp @@ -49,6 +49,8 @@ T tmain(T argc, S **argv) { for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #pragma omp for collapse (S) // expected-error {{'S' does not refer to a value}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; + #pragma omp for collapse (0xFFFFFFFFFFFFFFFF) // expected-error {{argument to 'collapse' clause requires a value that can be represented by a 64-bit}} + for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #if __cplusplus <= 199711L // expected-error@+4 2 {{integral constant expression}} expected-note@+4 0+{{constant expression}} #else diff --git a/clang/test/OpenMP/for_ordered_clause.cpp b/clang/test/OpenMP/for_ordered_clause.cpp index d9dbb82..4fdcefe 100644 --- a/clang/test/OpenMP/for_ordered_clause.cpp +++ b/clang/test/OpenMP/for_ordered_clause.cpp @@ -53,6 +53,9 @@ T tmain(T argc, S **argv) { #pragma omp for ordered(S) // expected-error {{'S' does not refer to a value}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i - ST]; +#pragma omp for ordered (0xFFFFFFFFFFFFFFFF) // expected-error {{argument to 'ordered' clause requires a value that can be represented by a 64-bit}} + for (int i = ST; i < N; i++) + argv[0][i] = argv[0][i] - argv[0][i-ST]; #if __cplusplus <= 199711L // expected-error@+4 2 {{integral constant expression}} expected-note@+4 0+{{constant expression}} #else diff --git a/clang/test/OpenMP/for_simd_collapse_messages.cpp b/clang/test/OpenMP/for_simd_collapse_messages.cpp index d9f8a2d..d108f93 100644 --- a/clang/test/OpenMP/for_simd_collapse_messages.cpp +++ b/clang/test/OpenMP/for_simd_collapse_messages.cpp @@ -43,6 +43,8 @@ T tmain(T argc, S **argv) { for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #pragma omp for simd collapse (S) // expected-error {{'S' does not refer to a value}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; + #pragma omp for simd collapse (0xFFFFFFFFFFFFFFFF) // expected-error {{argument to 'collapse' clause requires a value that can be represented by a 64-bit}} + for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #if __cplusplus <= 199711L // expected-error@+4 2 {{integral constant expression}} expected-note@+4 0+{{constant expression}} #else diff --git a/clang/test/OpenMP/for_simd_loop_messages.cpp b/clang/test/OpenMP/for_simd_loop_messages.cpp index 74a52f3..f58f0f3 100644 --- a/clang/test/OpenMP/for_simd_loop_messages.cpp +++ b/clang/test/OpenMP/for_simd_loop_messages.cpp @@ -735,6 +735,9 @@ void test_ordered() { #pragma omp for simd ordered(1) for (int i = 0; i < 16; ++i) ; +#pragma omp for simd ordered (0xFFFFFFFFFFFFFFFF) // expected-error {{argument to 'ordered' clause requires a value that can be represented by a 64-bit}} + for (int i = 0; i < 10; i++) + ; } void test_nowait() { diff --git a/clang/test/OpenMP/masked_taskloop_collapse_messages.cpp b/clang/test/OpenMP/masked_taskloop_collapse_messages.cpp index 6c15d4f..067f443 100644 --- a/clang/test/OpenMP/masked_taskloop_collapse_messages.cpp +++ b/clang/test/OpenMP/masked_taskloop_collapse_messages.cpp @@ -43,6 +43,8 @@ T tmain(T argc, S **argv) { for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #pragma omp masked taskloop collapse (S) // expected-error {{'S' does not refer to a value}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; + #pragma omp masked taskloop collapse (0xFFFFFFFFFFFFFFFF) // expected-error {{argument to 'collapse' clause requires a value that can be represented by a 64-bit}} + for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #if __cplusplus <= 199711L // expected-error@+4 2 {{integral constant expression}} expected-note@+4 0+{{constant expression}} #else diff --git a/clang/test/OpenMP/masked_taskloop_simd_collapse_messages.cpp b/clang/test/OpenMP/masked_taskloop_simd_collapse_messages.cpp index 0ecf9d9..a906853 100644 --- a/clang/test/OpenMP/masked_taskloop_simd_collapse_messages.cpp +++ b/clang/test/OpenMP/masked_taskloop_simd_collapse_messages.cpp @@ -43,6 +43,8 @@ T tmain(T argc, S **argv) { for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #pragma omp masked taskloop simd collapse (S) // expected-error {{'S' does not refer to a value}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; + #pragma omp masked taskloop simd collapse (0xFFFFFFFFFFFFFFFF) // expected-error {{argument to 'collapse' clause requires a value that can be represented by a 64-bit}} + for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #if __cplusplus <= 199711L // expected-error@+4 2 {{integral constant expression}} expected-note@+4 0+{{constant expression}} #else diff --git a/clang/test/OpenMP/simd_collapse_messages.cpp b/clang/test/OpenMP/simd_collapse_messages.cpp index d74033d..bd0040c 100644 --- a/clang/test/OpenMP/simd_collapse_messages.cpp +++ b/clang/test/OpenMP/simd_collapse_messages.cpp @@ -43,6 +43,8 @@ T tmain(T argc, S **argv) { for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #pragma omp simd collapse (S) // expected-error {{'S' does not refer to a value}} for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; + #pragma omp simd collapse (0xFFFFFFFFFFFFFFFF) // expected-error {{argument to 'collapse' clause requires a value that can be represented by a 64-bit}} + for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; #if __cplusplus <= 199711L // expected-error@+4 2 {{integral constant expression}} expected-note@+4 0+{{constant expression}} #else |