Author: cchen Date: 2020-08-07T18:07:48-05:00 New Revision: 3adc9aeb250cb9a9d4e5abf7ee5752e142ffe9b8
URL: https://github.com/llvm/llvm-project/commit/3adc9aeb250cb9a9d4e5abf7ee5752e142ffe9b8 DIFF: https://github.com/llvm/llvm-project/commit/3adc9aeb250cb9a9d4e5abf7ee5752e142ffe9b8.diff LOG: [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 Added: Modified: clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/target_map_messages.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index aa5613e8ce46..a493f3114dc2 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -16955,6 +16955,11 @@ class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> { 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 index 1d962f8f091f..7311f6acd823 100644 --- a/clang/test/OpenMP/target_map_messages.cpp +++ b/clang/test/OpenMP/target_map_messages.cpp @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits