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

via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 7 16:08:21 PDT 2020


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


        


More information about the cfe-commits mailing list