From: Alexey Bataev Date: Wed, 2 May 2018 18:44:10 +0000 (+0000) Subject: [OPENMP] Analyze the type of the mapped entity instead of its base. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8eb6a2dbe7eb57c4c96fa809130179cceeb36dfd;p=clang [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@331385 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 832f03b939..292cc6710a 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -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. diff --git a/test/OpenMP/target_map_messages.cpp b/test/OpenMP/target_map_messages.cpp index 17f3ba5bac..03a81ee575 100644 --- a/test/OpenMP/target_map_messages.cpp +++ b/test/OpenMP/target_map_messages.cpp @@ -19,6 +19,13 @@ void foo(int arg) { {} } #else + +struct SREF { + int &a; + int b; + SREF(int &a) : a(a) {} +}; + template 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}} {}