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}} {} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits