]> granicus.if.org Git - clang/commitdiff
[OPENMP] Analyze the type of the mapped entity instead of its base.
authorAlexey Bataev <a.bataev@hotmail.com>
Wed, 2 May 2018 18:44:10 +0000 (18:44 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Wed, 2 May 2018 18:44:10 +0000 (18:44 +0000)
If the mapped entity is a data member, we erroneously checked the type
of its base rather than the type of the mapped entity itself.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@331385 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOpenMP.cpp
test/OpenMP/target_map_messages.cpp

index 832f03b93942e90863de41c3e7b66ccb56a95caa..292cc6710aa732825b45081c55b2927d7bcd0b4a 100644 (file)
@@ -12305,7 +12305,14 @@ checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS,
     // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C++, p.1]
     //  If the type of a list item is a reference to a type T then the type will
     //  be considered to be T for all purposes of this clause.
-    QualType Type = CurDeclaration->getType().getNonReferenceType();
+    auto I = llvm::find_if(
+        CurComponents,
+        [](const OMPClauseMappableExprCommon::MappableComponent &MC) {
+          return MC.getAssociatedDeclaration();
+        });
+    assert(I != CurComponents.end() && "Null decl on map clause.");
+    QualType Type =
+        I->getAssociatedDeclaration()->getType().getNonReferenceType();
 
     // OpenMP 4.5 [2.10.5, target update Construct, Restrictions, p.4]
     // A list item in a to or from clause must have a mappable type.
index 17f3ba5bacee9227fb3f4f909601b82b018e38bf..03a81ee575b6f8011a5636bf95f615caf58906c4 100644 (file)
@@ -19,6 +19,13 @@ void foo(int arg) {
   {}
 }
 #else
+
+struct SREF {
+  int &a;
+  int b;
+  SREF(int &a) : a(a) {}
+};
+
 template <typename T, int I>
 struct SA {
   static int ss;
@@ -31,13 +38,14 @@ struct SA {
   T *f;
   int bf : 20;
   void func(int arg) {
+    SREF sref(arg);
     #pragma omp target
     {
       a = 0.0;
       func(arg);
       bf = 20;
     }
-    #pragma omp target map(arg,a,d)
+    #pragma omp target map(arg,a,d,sref.b)
     {}
     #pragma omp target map(arg[2:2],a,d) // expected-error {{subscripted value is not an array or pointer}}
     {}