Skip to content

Commit a9036f2

Browse files
committed
[OPENMP]Fix error emission for dependent expressions in iterators for depend clauses.
Need to postpone analysis for addressable lvalue in a depend clause with iterators, otherwise the incorrect error message is emitted. Differential Revision: https://reviews.llvm.org/D114653
1 parent 8f4013a commit a9036f2

File tree

5 files changed

+42
-14
lines changed

5 files changed

+42
-14
lines changed

clang/lib/Sema/SemaOpenMP.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18636,22 +18636,19 @@ Sema::ActOnOpenMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1863618636
if (!RefExpr->isValueDependent() && !RefExpr->isTypeDependent() &&
1863718637
!RefExpr->isInstantiationDependent() &&
1863818638
!RefExpr->containsUnexpandedParameterPack() &&
18639-
(OMPDependTFound &&
18640-
DSAStack->getOMPDependT().getTypePtr() == ExprTy.getTypePtr())) {
18639+
(!RefExpr->IgnoreParenImpCasts()->isLValue() ||
18640+
(OMPDependTFound &&
18641+
DSAStack->getOMPDependT().getTypePtr() == ExprTy.getTypePtr()))) {
1864118642
Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item)
18642-
<< (LangOpts.OpenMP >= 50 ? 1 : 0) << 1
18643-
<< RefExpr->getSourceRange();
18643+
<< (LangOpts.OpenMP >= 50 ? 1 : 0)
18644+
<< (LangOpts.OpenMP >= 50 ? 1 : 0) << RefExpr->getSourceRange();
1864418645
continue;
1864518646
}
1864618647

1864718648
auto *ASE = dyn_cast<ArraySubscriptExpr>(SimpleExpr);
18648-
if (!RefExpr->IgnoreParenImpCasts()->isLValue() ||
18649-
(ASE && !ASE->getBase()->isTypeDependent() &&
18650-
!ASE->getBase()
18651-
->getType()
18652-
.getNonReferenceType()
18653-
->isPointerType() &&
18654-
!ASE->getBase()->getType().getNonReferenceType()->isArrayType())) {
18649+
if (ASE && !ASE->getBase()->isTypeDependent() &&
18650+
!ASE->getBase()->getType().getNonReferenceType()->isPointerType() &&
18651+
!ASE->getBase()->getType().getNonReferenceType()->isArrayType()) {
1865518652
Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item)
1865618653
<< (LangOpts.OpenMP >= 50 ? 1 : 0)
1865718654
<< (LangOpts.OpenMP >= 50 ? 1 : 0) << RefExpr->getSourceRange();

clang/test/OpenMP/target_enter_data_depend_messages.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ int tmain(T argc, S **argv, R *env[]) {
4646
foo();
4747
#pragma omp target enter data map(to: i) depend (out :S1) // expected-error {{'S1' does not refer to a value}}
4848
foo();
49-
#pragma omp target enter data map(to : i) depend(in : argv[1][1] = '2') // omp4-error {{expected addressable lvalue expression, array element or array section}} omp5-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}}
49+
#pragma omp target enter data map(to : i) depend(in : argv[1][1] = '2')
5050
foo();
5151
#pragma omp target enter data map(to : i) depend(in : vec[1]) // omp4-error {{expected addressable lvalue expression, array element or array section}} omp5-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}}
5252
foo();

clang/test/OpenMP/target_exit_data_depend_messages.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ int tmain(T argc, S **argv, R *env[]) {
4646
foo();
4747
#pragma omp target exit data map(from: i) depend (out :S1) // expected-error {{'S1' does not refer to a value}}
4848
foo();
49-
#pragma omp target exit data map(from : i) depend(in : argv[1][1] = '2') // omp4-error {{expected addressable lvalue expression, array element or array section}} omp5-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}}
49+
#pragma omp target exit data map(from : i) depend(in : argv[1][1] = '2')
5050
foo();
5151
#pragma omp target exit data map(from : i) depend(in : vec[1]) // omp4-error {{expected addressable lvalue expression, array element or array section}} omp5-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}}
5252
foo();

clang/test/OpenMP/target_update_depend_messages.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ int tmain(T argc, S **argv, R *env[]) {
3939
#pragma omp target update to(z) depend(out:) // expected-error {{expected expression}}
4040
#pragma omp target update to(z) depend(inout : foobool(argc)), depend(in, argc) // omp4-error {{expected addressable lvalue expression, array element or array section}} omp5-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
4141
#pragma omp target update to(z) depend(out : S1) // expected-error {{'S1' does not refer to a value}}
42-
#pragma omp target update to(z) depend(in : argv[1][1] = '2') // omp4-error {{expected addressable lvalue expression, array element or array section}} omp5-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}}
42+
#pragma omp target update to(z) depend(in : argv[1][1] = '2')
4343
#pragma omp target update to(z) depend(in : vec[1]) // omp4-error {{expected addressable lvalue expression, array element or array section}} omp5-error {{expected addressable lvalue expression, array element, array section or array shaping expression of non 'omp_depend_t' type}}
4444
#pragma omp target update to(z) depend(in : argv[0])
4545
#pragma omp target update to(z) depend(in:) // expected-error {{expected expression}}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s
2+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
3+
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4+
5+
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s
6+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
7+
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8+
// expected-no-diagnostics
9+
10+
#ifndef HEADER
11+
#define HEADER
12+
13+
template <typename> class vector {
14+
public:
15+
int &at(long);
16+
};
17+
18+
// CHECK: template <typename T> void foo(int n) {
19+
// CHECK-NEXT: vector<T> v;
20+
// CHECK-NEXT: vector<int> iv1;
21+
// CHECK-NEXT: #pragma omp task depend(iterator(int i = 0:n), in : v.at(i),iv1.at(i))
22+
// CHECK-NEXT: ;
23+
// CHECK-NEXT: }
24+
25+
template <typename T> void foo(int n) {
26+
vector<T> v;
27+
vector<int> iv1;
28+
#pragma omp task depend(iterator(i = 0 : n), in : v.at(i), iv1.at(i))
29+
;
30+
}
31+
#endif

0 commit comments

Comments
 (0)