Author: Amr Hesham
Date: 2025-05-12T21:34:35+02:00
New Revision: a4186bd04bca16a23769d9461e4b0fc1c7a03f53

URL: 
https://github.com/llvm/llvm-project/commit/a4186bd04bca16a23769d9461e4b0fc1c7a03f53
DIFF: 
https://github.com/llvm/llvm-project/commit/a4186bd04bca16a23769d9461e4b0fc1c7a03f53.diff

LOG: [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

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/include/clang/Basic/DiagnosticSemaKinds.td
    clang/lib/Sema/SemaOpenMP.cpp
    clang/test/OpenMP/for_collapse_messages.cpp
    clang/test/OpenMP/for_ordered_clause.cpp
    clang/test/OpenMP/for_simd_collapse_messages.cpp
    clang/test/OpenMP/for_simd_loop_messages.cpp
    clang/test/OpenMP/masked_taskloop_collapse_messages.cpp
    clang/test/OpenMP/masked_taskloop_simd_collapse_messages.cpp
    clang/test/OpenMP/simd_collapse_messages.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 14d526a71f458..fb0318146aa60 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 ca47cf62324f3..3efe9593b8633 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 9d02594afd551..be6ce97d838f3 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 07630ffaaed95..147536e7eaaea 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 d9dbb828f6452..4fdcefe40d28e 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 d9f8a2d971518..d108f93e7e5c6 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 74a52f3f5d694..f58f0f38bd3b5 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 6c15d4fd76882..067f4437c8a77 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 0ecf9d9db484c..a906853c90fed 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 d74033dcddc8d..bd0040c1b1357 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


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to