[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
This commit is contained in:
@@ -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
|
||||
----------------------------------
|
||||
|
||||
|
||||
@@ -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">;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user