diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -16955,6 +16955,11 @@ 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; diff --git a/clang/test/OpenMP/target_map_messages.cpp b/clang/test/OpenMP/target_map_messages.cpp --- a/clang/test/OpenMP/target_map_messages.cpp +++ b/clang/test/OpenMP/target_map_messages.cpp @@ -499,6 +499,23 @@ typedef int from; +struct dim { + double x, y; +}; + +template +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 // expected-note {{declared here}} T tmain(T argc) { const T d = 5; @@ -837,6 +854,16 @@ 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 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(argc)+tmain(argc); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} } #endif