Skip to content

Commit

Permalink
[OPENMP] Allow all lvalues in 'depend' clause.
Browse files Browse the repository at this point in the history
According to upcoming OpenMP 5.0 all addressable lvalue expressions are
allowed in deoend clause.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@309309 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
alexey-bataev committed Jul 27, 2017
1 parent 7912acb commit 1ea5f1f
Show file tree
Hide file tree
Showing 16 changed files with 99 additions and 94 deletions.
2 changes: 2 additions & 0 deletions include/clang/Basic/DiagnosticSemaKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -8519,6 +8519,8 @@ def err_omp_expected_var_name_member_expr : Error<
"expected variable name%select{| or data member of current class}0">;
def err_omp_expected_var_name_member_expr_or_array_item : Error<
"expected variable name%select{|, data member of current class}0, array element or array section">;
def err_omp_expected_addressable_lvalue_or_array_item : Error<
"expected addressable lvalue expression, array element or array section">;
def err_omp_expected_named_var_member_or_array_expression: Error<
"expected expression containing only member accesses and/or array sections based on named variables">;
def err_omp_bit_fields_forbidden_in_clause : Error<
Expand Down
21 changes: 12 additions & 9 deletions lib/Sema/SemaOpenMP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10486,23 +10486,26 @@ Sema::ActOnOpenMPDependClause(OpenMPDependClauseKind DepKind,
}
OpsOffs.push_back({RHS, OOK});
} else {
// OpenMP [2.11.1.1, Restrictions, p.3]
// A variable that is part of another variable (such as a field of a
// structure) but is not an array element or an array section cannot
// appear in a depend clause.
auto *DE = dyn_cast<DeclRefExpr>(SimpleExpr);
auto *ASE = dyn_cast<ArraySubscriptExpr>(SimpleExpr);
auto *OASE = dyn_cast<OMPArraySectionExpr>(SimpleExpr);
if (!RefExpr->IgnoreParenImpCasts()->isLValue() ||
(!ASE && !DE && !OASE) || (DE && !isa<VarDecl>(DE->getDecl())) ||
(ASE &&
!ASE->getBase()
->getType()
.getNonReferenceType()
->isPointerType() &&
!ASE->getBase()->getType().getNonReferenceType()->isArrayType())) {
Diag(ELoc, diag::err_omp_expected_var_name_member_expr_or_array_item)
<< 0 << RefExpr->getSourceRange();
Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item)
<< RefExpr->getSourceRange();
continue;
}
bool Suppress = getDiagnostics().getSuppressAllDiagnostics();
getDiagnostics().setSuppressAllDiagnostics(/*Val=*/true);
ExprResult Res = CreateBuiltinUnaryOp(SourceLocation(), UO_AddrOf,
RefExpr->IgnoreParenImpCasts());
getDiagnostics().setSuppressAllDiagnostics(Suppress);
if (!Res.isUsable() && !isa<OMPArraySectionExpr>(SimpleExpr)) {
Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item)
<< RefExpr->getSourceRange();
continue;
}
}
Expand Down
10 changes: 5 additions & 5 deletions test/OpenMP/target_depend_messages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,21 @@ int main(int argc, char **argv, char *env[]) {
foo();
#pragma omp target depend (out: ) // expected-error {{expected expression}}
foo();
#pragma omp target depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected variable name, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
#pragma omp target depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
foo();
#pragma omp target depend (out :S1) // expected-error {{'S1' does not refer to a value}}
foo();
#pragma omp target depend(in : argv[1][1] = '2') // expected-error {{expected variable name, array element or array section}}
#pragma omp target depend(in : argv[1][1] = '2')
foo();
#pragma omp target depend (in : vec[1]) // expected-error {{expected variable name, array element or array section}}
#pragma omp target depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target depend (in : argv[0])
foo();
#pragma omp target depend (in : ) // expected-error {{expected expression}}
foo();
#pragma omp target depend (in : main) // expected-error {{expected variable name, array element or array section}}
#pragma omp target depend (in : main)
foo();
#pragma omp target depend(in : a[0]) // expected-error{{expected variable name, array element or array section}}
#pragma omp target depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target depend (in : vec[1:2]) // expected-error {{ value is not an array or pointer}}
foo();
Expand Down
20 changes: 10 additions & 10 deletions test/OpenMP/target_enter_data_depend_messages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,21 +38,21 @@ int tmain(T argc, S **argv, R *env[]) {
foo();
#pragma omp target enter data map(to: i) depend (out: ) // expected-error {{expected expression}}
foo();
#pragma omp target enter data map(to: i) depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected variable name, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
#pragma omp target enter data map(to: i) depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
foo();
#pragma omp target enter data map(to: i) depend (out :S1) // expected-error {{'S1' does not refer to a value}}
foo();
#pragma omp target enter data map(to: i) depend(in : argv[1][1] = '2') // expected-error {{expected variable name, array element or array section}}
#pragma omp target enter data map(to: i) depend(in : argv[1][1] = '2') // expected-error {{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target enter data map(to: i) depend (in : vec[1]) // expected-error {{expected variable name, array element or array section}}
#pragma omp target enter data map(to: i) depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target enter data map(to: i) depend (in : argv[0])
foo();
#pragma omp target enter data map(to: i) depend (in : ) // expected-error {{expected expression}}
foo();
#pragma omp target enter data map(to: i) depend (in : tmain) // expected-error {{expected variable name, array element or array section}}
#pragma omp target enter data map(to: i) depend (in : tmain)
foo();
#pragma omp target enter data map(to: i) depend(in : a[0]) // expected-error{{expected variable name, array element or array section}}
#pragma omp target enter data map(to: i) depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target enter data map(to: i) depend (in : vec[1:2]) // expected-error {{ value is not an array or pointer}}
foo();
Expand Down Expand Up @@ -113,21 +113,21 @@ int main(int argc, char **argv, char *env[]) {
foo();
#pragma omp target enter data map(to: i) depend (out: ) // expected-error {{expected expression}}
foo();
#pragma omp target enter data map(to: i) depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected variable name, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
#pragma omp target enter data map(to: i) depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
foo();
#pragma omp target enter data map(to: i) depend (out :S1) // expected-error {{'S1' does not refer to a value}}
foo();
#pragma omp target enter data map(to: i) depend(in : argv[1][1] = '2') // expected-error {{expected variable name, array element or array section}}
#pragma omp target enter data map(to: i) depend(in : argv[1][1] = '2')
foo();
#pragma omp target enter data map(to: i) depend (in : vec[1]) // expected-error {{expected variable name, array element or array section}}
#pragma omp target enter data map(to: i) depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target enter data map(to: i) depend (in : argv[0])
foo();
#pragma omp target enter data map(to: i) depend (in : ) // expected-error {{expected expression}}
foo();
#pragma omp target enter data map(to: i) depend (in : main) // expected-error {{expected variable name, array element or array section}}
#pragma omp target enter data map(to: i) depend (in : main)
foo();
#pragma omp target enter data map(to: i) depend(in : a[0]) // expected-error{{expected variable name, array element or array section}}
#pragma omp target enter data map(to: i) depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target enter data map(to: i) depend (in : vec[1:2]) // expected-error {{ value is not an array or pointer}}
foo();
Expand Down
20 changes: 10 additions & 10 deletions test/OpenMP/target_exit_data_depend_messages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,21 +38,21 @@ int tmain(T argc, S **argv, R *env[]) {
foo();
#pragma omp target exit data map(from: i) depend (out: ) // expected-error {{expected expression}}
foo();
#pragma omp target exit data map(from: i) depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected variable name, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
#pragma omp target exit data map(from: i) depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
foo();
#pragma omp target exit data map(from: i) depend (out :S1) // expected-error {{'S1' does not refer to a value}}
foo();
#pragma omp target exit data map(from: i) depend(in : argv[1][1] = '2') // expected-error {{expected variable name, array element or array section}}
#pragma omp target exit data map(from: i) depend(in : argv[1][1] = '2') // expected-error {{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target exit data map(from: i) depend (in : vec[1]) // expected-error {{expected variable name, array element or array section}}
#pragma omp target exit data map(from: i) depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target exit data map(from: i) depend (in : argv[0])
foo();
#pragma omp target exit data map(from: i) depend (in : ) // expected-error {{expected expression}}
foo();
#pragma omp target exit data map(from: i) depend (in : tmain) // expected-error {{expected variable name, array element or array section}}
#pragma omp target exit data map(from: i) depend (in : tmain)
foo();
#pragma omp target exit data map(from: i) depend(in : a[0]) // expected-error{{expected variable name, array element or array section}}
#pragma omp target exit data map(from: i) depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target exit data map(from: i) depend (in : vec[1:2]) // expected-error {{ value is not an array or pointer}}
foo();
Expand Down Expand Up @@ -113,21 +113,21 @@ int main(int argc, char **argv, char *env[]) {
foo();
#pragma omp target exit data map(from: i) depend (out: ) // expected-error {{expected expression}}
foo();
#pragma omp target exit data map(from: i) depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected variable name, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
#pragma omp target exit data map(from: i) depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
foo();
#pragma omp target exit data map(from: i) depend (out :S1) // expected-error {{'S1' does not refer to a value}}
foo();
#pragma omp target exit data map(from: i) depend(in : argv[1][1] = '2') // expected-error {{expected variable name, array element or array section}}
#pragma omp target exit data map(from: i) depend(in : argv[1][1] = '2')
foo();
#pragma omp target exit data map(from: i) depend (in : vec[1]) // expected-error {{expected variable name, array element or array section}}
#pragma omp target exit data map(from: i) depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target exit data map(from: i) depend (in : argv[0])
foo();
#pragma omp target exit data map(from: i) depend (in : ) // expected-error {{expected expression}}
foo();
#pragma omp target exit data map(from: i) depend (in : main) // expected-error {{expected variable name, array element or array section}}
#pragma omp target exit data map(from: i) depend (in : main)
foo();
#pragma omp target exit data map(from: i) depend(in : a[0]) // expected-error{{expected variable name, array element or array section}}
#pragma omp target exit data map(from: i) depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target exit data map(from: i) depend (in : vec[1:2]) // expected-error {{ value is not an array or pointer}}
foo();
Expand Down
10 changes: 5 additions & 5 deletions test/OpenMP/target_parallel_depend_messages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,21 @@ int main(int argc, char **argv, char *env[]) {
foo();
#pragma omp target parallel depend (out: ) // expected-error {{expected expression}}
foo();
#pragma omp target parallel depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected variable name, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
#pragma omp target parallel depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
foo();
#pragma omp target parallel depend (out :S1) // expected-error {{'S1' does not refer to a value}}
foo();
#pragma omp target parallel depend(in : argv[1][1] = '2') // expected-error {{expected variable name, array element or array section}}
#pragma omp target parallel depend(in : argv[1][1] = '2')
foo();
#pragma omp target parallel depend (in : vec[1]) // expected-error {{expected variable name, array element or array section}}
#pragma omp target parallel depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target parallel depend (in : argv[0])
foo();
#pragma omp target parallel depend (in : ) // expected-error {{expected expression}}
foo();
#pragma omp target parallel depend (in : main) // expected-error {{expected variable name, array element or array section}}
#pragma omp target parallel depend (in : main)
foo();
#pragma omp target parallel depend(in : a[0]) // expected-error{{expected variable name, array element or array section}}
#pragma omp target parallel depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element or array section}}
foo();
#pragma omp target parallel depend (in : vec[1:2]) // expected-error {{ value is not an array or pointer}}
foo();
Expand Down
10 changes: 5 additions & 5 deletions test/OpenMP/target_parallel_for_depend_messages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,21 @@ int main(int argc, char **argv, char *env[]) {
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend (out: ) // expected-error {{expected expression}}
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected variable name, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
#pragma omp target parallel for depend (inout : foobool(argc)), depend (in, argc) // expected-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend (out :S1) // expected-error {{'S1' does not refer to a value}}
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend(in : argv[1][1] = '2') // expected-error {{expected variable name, array element or array section}}
#pragma omp target parallel for depend(in : argv[1][1] = '2')
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend (in : vec[1]) // expected-error {{expected variable name, array element or array section}}
#pragma omp target parallel for depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element or array section}}
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend (in : argv[0])
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend (in : ) // expected-error {{expected expression}}
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend (in : main) // expected-error {{expected variable name, array element or array section}}
#pragma omp target parallel for depend (in : main)
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend(in : a[0]) // expected-error{{expected variable name, array element or array section}}
#pragma omp target parallel for depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element or array section}}
for (i = 0; i < argc; ++i) foo();
#pragma omp target parallel for depend (in : vec[1:2]) // expected-error {{ value is not an array or pointer}}
for (i = 0; i < argc; ++i) foo();
Expand Down
Loading

0 comments on commit 1ea5f1f

Please sign in to comment.