[OpenMP 5.0] Fix PR-45212: Shouldn't error out while using overloaded operator for map clause

LValue map checker should handle CXXOperatorCallExpr

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D85563
This commit is contained in:
cchen 2020-08-07 18:04:56 -05:00
parent b0d76f454d
commit 3adc9aeb25
2 changed files with 32 additions and 0 deletions

View File

@ -16955,6 +16955,11 @@ public:
Components.emplace_back(CTE, nullptr);
return true;
}
bool VisitCXXOperatorCallExpr(CXXOperatorCallExpr *COCE) {
assert(!RelevantExpr && "RelevantExpr is expected to be nullptr");
Components.emplace_back(COCE, nullptr);
return true;
}
bool VisitStmt(Stmt *) {
emitErrorMsg();
return false;

View File

@ -499,6 +499,23 @@ S3 h;
typedef int from;
struct dim {
double x, y;
};
template<typename T>
class Array1D
{
public:
unsigned n1;
unsigned size;
T * dptr;
inline T& operator() (unsigned i1) { return dptr[i1]; }
Array1D() {n1=0;size=0;dptr=nullptr;}
};
template <typename T, int I> // expected-note {{declared here}}
T tmain(T argc) {
const T d = 5;
@ -837,6 +854,16 @@ int main(int argc, char **argv) {
Arr[0] = 2; // lt50-error {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}}
}
Array1D<dim> pos;
#pragma omp target enter data map(to:pos)
#pragma omp target enter data map(to:pos.dptr[0:pos.size])
#pragma omp target teams distribute parallel for
for(int i=0; i<100; i++) {
pos(i).x = i;
pos(i).y = i+1;
}
return tmain<int, 3>(argc)+tmain<from, 4>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<int, 4>' requested here}}
}
#endif