mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 02:16:07 +00:00
[OpenMP] diagnose zero-length array section in the depend clause
The OpenMP specification disallows having zero-length array sections in the depend clause (OpenMP 5.0 2.17.11). Differential Revision: https://reviews.llvm.org/D71969
This commit is contained in:
parent
d2d2fb19f7
commit
427ffa2cdb
@ -9640,6 +9640,8 @@ def err_omp_depend_sink_expected_plus_minus : Error<
|
||||
"expected '+' or '-' operation">;
|
||||
def err_omp_depend_sink_source_not_allowed : Error<
|
||||
"'depend(%select{source|sink:vec}0)' clause%select{|s}0 cannot be mixed with 'depend(%select{sink:vec|source}0)' clause%select{s|}0">;
|
||||
def err_omp_depend_zero_length_array_section_not_allowed : Error<
|
||||
"zero-length array section is not allowed in 'depend' clause">;
|
||||
def err_omp_linear_ordered : Error<
|
||||
"'linear' clause cannot be specified along with 'ordered' clause with a parameter">;
|
||||
def err_omp_unexpected_schedule_modifier : Error<
|
||||
|
@ -15020,6 +15020,22 @@ Sema::ActOnOpenMPDependClause(OpenMPDependClauseKind DepKind,
|
||||
}
|
||||
OpsOffs.emplace_back(RHS, OOK);
|
||||
} else {
|
||||
// OpenMP 5.0 [2.17.11, Restrictions]
|
||||
// List items used in depend clauses cannot be zero-length array sections.
|
||||
const auto *OASE = dyn_cast<OMPArraySectionExpr>(SimpleExpr);
|
||||
if (OASE) {
|
||||
const Expr *Length = OASE->getLength();
|
||||
Expr::EvalResult Result;
|
||||
if (Length && !Length->isValueDependent() &&
|
||||
Length->EvaluateAsInt(Result, Context) &&
|
||||
Result.Val.getInt().isNullValue()) {
|
||||
Diag(ELoc,
|
||||
diag::err_omp_depend_zero_length_array_section_not_allowed)
|
||||
<< SimpleExpr->getSourceRange();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
auto *ASE = dyn_cast<ArraySubscriptExpr>(SimpleExpr);
|
||||
if (!RefExpr->IgnoreParenImpCasts()->isLValue() ||
|
||||
(ASE &&
|
||||
|
@ -74,7 +74,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
foo();
|
||||
#pragma omp target depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
foo();
|
||||
#pragma omp target depend (in : argv[-1:0])
|
||||
#pragma omp target depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
foo();
|
||||
#pragma omp target depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
foo();
|
||||
|
@ -70,7 +70,7 @@ int tmain(T argc, S **argv, R *env[]) {
|
||||
foo();
|
||||
#pragma omp target enter data map(to: i) depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
foo();
|
||||
#pragma omp target enter data map(to: i) depend (in : argv[-1:0])
|
||||
#pragma omp target enter data map(to: i) depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
foo();
|
||||
#pragma omp target enter data map(to: i) depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
foo();
|
||||
@ -145,7 +145,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
foo();
|
||||
#pragma omp target enter data map(to: i) depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
foo();
|
||||
#pragma omp target enter data map(to: i) depend (in : argv[-1:0])
|
||||
#pragma omp target enter data map(to: i) depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
foo();
|
||||
#pragma omp target enter data map(to: i) depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
foo();
|
||||
|
@ -70,7 +70,7 @@ int tmain(T argc, S **argv, R *env[]) {
|
||||
foo();
|
||||
#pragma omp target exit data map(from: i) depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
foo();
|
||||
#pragma omp target exit data map(from: i) depend (in : argv[-1:0])
|
||||
#pragma omp target exit data map(from: i) depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
foo();
|
||||
#pragma omp target exit data map(from: i) depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
foo();
|
||||
@ -145,7 +145,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
foo();
|
||||
#pragma omp target exit data map(from: i) depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
foo();
|
||||
#pragma omp target exit data map(from: i) depend (in : argv[-1:0])
|
||||
#pragma omp target exit data map(from: i) depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
foo();
|
||||
#pragma omp target exit data map(from: i) depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
foo();
|
||||
|
@ -68,7 +68,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
foo();
|
||||
#pragma omp target parallel depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
foo();
|
||||
#pragma omp target parallel depend (in : argv[-1:0])
|
||||
#pragma omp target parallel depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
foo();
|
||||
#pragma omp target parallel depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
foo();
|
||||
|
@ -69,7 +69,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target parallel for depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target parallel for depend (in : argv[-1:0])
|
||||
#pragma omp target parallel for depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target parallel for depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
|
@ -69,7 +69,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target parallel for simd depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target parallel for simd depend (in : argv[-1:0])
|
||||
#pragma omp target parallel for simd depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target parallel for simd depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
|
@ -69,7 +69,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target simd depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target simd depend (in : argv[-1:0]) // OK
|
||||
#pragma omp target simd depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target simd depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
|
@ -68,7 +68,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
foo();
|
||||
#pragma omp target teams depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
foo();
|
||||
#pragma omp target teams depend (in : argv[-1:0])
|
||||
#pragma omp target teams depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
foo();
|
||||
#pragma omp target teams depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
foo();
|
||||
|
@ -69,7 +69,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute depend (in : argv[-1:0])
|
||||
#pragma omp target teams distribute depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
|
@ -69,7 +69,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute parallel for depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute parallel for depend (in : argv[-1:0])
|
||||
#pragma omp target teams distribute parallel for depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute parallel for depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
|
@ -69,7 +69,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute parallel for simd depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute parallel for simd depend (in : argv[-1:0])
|
||||
#pragma omp target teams distribute parallel for simd depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute parallel for simd depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
|
@ -69,7 +69,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute simd depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute simd depend (in : argv[-1:0])
|
||||
#pragma omp target teams distribute simd depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
#pragma omp target teams distribute simd depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
for (i = 0; i < argc; ++i) foo();
|
||||
|
@ -15,7 +15,6 @@ class vector {
|
||||
public:
|
||||
int operator[](int index) { return 0; }
|
||||
};
|
||||
|
||||
template <class T, class S, class R>
|
||||
int tmain(T argc, S **argv, R *env[]) {
|
||||
vector vec;
|
||||
@ -52,7 +51,7 @@ int tmain(T argc, S **argv, R *env[]) {
|
||||
#pragma omp target update to(z) depend(in : argv[argc: // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}
|
||||
#pragma omp target update to(z) depend(in : argv[argc:argc] // expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
#pragma omp target update to(z) depend(in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
#pragma omp target update to(z) depend(in : argv[-1:0])
|
||||
#pragma omp target update to(z) depend(in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
#pragma omp target update to(z) depend(in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
#pragma omp target update to(z) depend(in : argv[3:4:1]) // expected-error {{expected ']'}} expected-note {{to match this '['}}
|
||||
#pragma omp target update to(z) depend(in:a[0:1]) // expected-error {{subscripted value is not an array or pointer}}
|
||||
@ -64,7 +63,6 @@ int tmain(T argc, S **argv, R *env[]) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv, char *env[]) {
|
||||
vector vec;
|
||||
typedef float V __attribute__((vector_size(16)));
|
||||
@ -100,7 +98,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
#pragma omp target update to(z) depend(in : argv[argc: // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}
|
||||
#pragma omp target update to(z) depend(in : argv[argc:argc] // expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
#pragma omp target update to(z) depend(in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
#pragma omp target update to(z) depend(in : argv[-1:0])
|
||||
#pragma omp target update to(z) depend(in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
#pragma omp target update to(z) depend(in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
#pragma omp target update to(z) depend(in : argv[3:4:1]) // expected-error {{expected ']'}} expected-note {{to match this '['}}
|
||||
#pragma omp target update to(z) depend(in:a[0:1]) // expected-error {{subscripted value is not an array or pointer}}
|
||||
@ -109,6 +107,5 @@ int main(int argc, char **argv, char *env[]) {
|
||||
#pragma omp target update to(z) depend(in:env[0:][:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is an array of unknown bound}}
|
||||
#pragma omp target update to(z) depend(in : argv[ : argc][1 : argc - 1])
|
||||
#pragma omp target update to(z) depend(in : arr[0])
|
||||
|
||||
return tmain(argc, argv, env); // expected-note {{in instantiation of function template specialization 'tmain<int, char, char>' requested here}}
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||
#pragma omp task depend (in : argv[argc: // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}
|
||||
#pragma omp task depend (in : argv[argc:argc] // expected-error {{expected ')'}} expected-note {{to match this '('}}
|
||||
#pragma omp task depend (in : argv[0:-1]) // expected-error {{section length is evaluated to a negative value -1}}
|
||||
#pragma omp task depend (in : argv[-1:0])
|
||||
#pragma omp task depend (in : argv[-1:0]) // expected-error {{zero-length array section is not allowed in 'depend' clause}}
|
||||
#pragma omp task depend (in : argv[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
|
||||
#pragma omp task depend (in : argv[3:4:1]) // expected-error {{expected ']'}} expected-note {{to match this '['}}
|
||||
#pragma omp task depend(in:a[0:1]) // expected-error {{subscripted value is not an array or pointer}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user