Skip to content

Commit 3f484eb

Browse files
committed
[clang][OpenMP] Add error for large expr in SIMD collapse
1 parent 4fb7d19 commit 3f484eb

File tree

4 files changed

+13
-0
lines changed

4 files changed

+13
-0
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,8 @@ Improvements to Clang's diagnostics
503503
- ``-Wreserved-identifier`` now fires on reserved parameter names in a function
504504
declaration which is not a definition.
505505

506+
- An error is now emitted when OpenMP SIMD ``collapse`` clause has expression larger than 64 bit.
507+
506508
Improvements to Clang's time-trace
507509
----------------------------------
508510

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11519,6 +11519,8 @@ def note_omp_collapse_ordered_expr : Note<
1151911519
"as specified in %select{'collapse'|'ordered'|'collapse' and 'ordered'}0 clause%select{||s}0">;
1152011520
def err_omp_negative_expression_in_clause : Error<
1152111521
"argument to '%0' clause must be a %select{non-negative|strictly positive}1 integer value">;
11522+
def err_omp_large_expression_in_clause : Error<
11523+
"argument to '%0' clause cannot have more than 64 bits size">;
1152211524
def err_omp_not_integral : Error<
1152311525
"expression must have integral or unscoped enumeration "
1152411526
"type, not %0">;

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15901,6 +15901,13 @@ ExprResult SemaOpenMP::VerifyPositiveIntegerConstantInClause(
1590115901
<< E->getSourceRange();
1590215902
return ExprError();
1590315903
}
15904+
15905+
if (!Result.isRepresentableByInt64()) {
15906+
Diag(E->getExprLoc(), diag::err_omp_large_expression_in_clause)
15907+
<< getOpenMPClauseNameForDiag(CKind) << E->getSourceRange();
15908+
return ExprError();
15909+
}
15910+
1590415911
if (CKind == OMPC_collapse && DSAStack->getAssociatedLoops() == 1)
1590515912
DSAStack->setAssociatedLoops(Result.getExtValue());
1590615913
else if (CKind == OMPC_ordered)

clang/test/OpenMP/simd_collapse_messages.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ T tmain(T argc, S **argv) {
4343
for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
4444
#pragma omp simd collapse (S) // expected-error {{'S' does not refer to a value}}
4545
for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
46+
#pragma omp simd collapse (0xFFFFFFFFFFFFFFFF) // expected-error {{argument to 'collapse' clause cannot have more than 64 bits size}}
47+
for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
4648
#if __cplusplus <= 199711L
4749
// expected-error@+4 2 {{integral constant expression}} expected-note@+4 0+{{constant expression}}
4850
#else

0 commit comments

Comments
 (0)