r331385 - [OPENMP] Analyze the type of the mapped entity instead of its base.

Alexey Bataev via cfe-commits cfe-commits at lists.llvm.org
Wed May 2 11:44:10 PDT 2018


Author: abataev
Date: Wed May  2 11:44:10 2018
New Revision: 331385

URL: http://llvm.org/viewvc/llvm-project?rev=331385&view=rev
Log:
[OPENMP] Analyze the type of the mapped entity instead of its base.

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.

Modified:
    cfe/trunk/lib/Sema/SemaOpenMP.cpp
    cfe/trunk/test/OpenMP/target_map_messages.cpp

Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=331385&r1=331384&r2=331385&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Wed May  2 11:44:10 2018
@@ -12305,7 +12305,14 @@ checkMappableExpressionList(Sema &SemaRe
     // 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.

Modified: cfe/trunk/test/OpenMP/target_map_messages.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_map_messages.cpp?rev=331385&r1=331384&r2=331385&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/target_map_messages.cpp (original)
+++ cfe/trunk/test/OpenMP/target_map_messages.cpp Wed May  2 11:44:10 2018
@@ -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}}
     {}




More information about the cfe-commits mailing list