diff options
Diffstat (limited to 'clang/lib/Sema/SemaOpenMP.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 28e40d32e09..e77f9083377 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1996,7 +1996,8 @@ public: } if (isOpenMPTargetExecutionDirective(DKind) && !FD->isBitField()) { OMPClauseMappableExprCommon::MappableExprComponentList CurComponents; - CheckMapClauseExpressionBase(SemaRef, E, CurComponents, OMPC_map); + if (!CheckMapClauseExpressionBase(SemaRef, E, CurComponents, OMPC_map)) + return; auto *VD = cast<ValueDecl>( CurComponents.back().getAssociatedDeclaration()->getCanonicalDecl()); if (!Stack->checkMappableExprComponentListsForDecl( @@ -11467,7 +11468,7 @@ static Expr *CheckMapClauseExpressionBase( if (auto *CurE = dyn_cast<DeclRefExpr>(E)) { if (!isa<VarDecl>(CurE->getDecl())) - break; + return nullptr; RelevantExpr = CurE; @@ -11477,12 +11478,8 @@ static Expr *CheckMapClauseExpressionBase( AllowWholeSizeArraySection = false; // Record the component. - CurComponents.push_back(OMPClauseMappableExprCommon::MappableComponent( - CurE, CurE->getDecl())); - continue; - } - - if (auto *CurE = dyn_cast<MemberExpr>(E)) { + CurComponents.emplace_back(CurE, CurE->getDecl()); + } else if (auto *CurE = dyn_cast<MemberExpr>(E)) { auto *BaseE = CurE->getBase()->IgnoreParenImpCasts(); if (isa<CXXThisExpr>(BaseE)) @@ -11494,7 +11491,7 @@ static Expr *CheckMapClauseExpressionBase( if (!isa<FieldDecl>(CurE->getMemberDecl())) { SemaRef.Diag(ELoc, diag::err_omp_expected_access_to_data_field) << CurE->getSourceRange(); - break; + return nullptr; } auto *FD = cast<FieldDecl>(CurE->getMemberDecl()); @@ -11505,7 +11502,7 @@ static Expr *CheckMapClauseExpressionBase( if (FD->isBitField()) { SemaRef.Diag(ELoc, diag::err_omp_bit_fields_forbidden_in_clause) << CurE->getSourceRange() << getOpenMPClauseName(CKind); - break; + return nullptr; } // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C++, p.1] @@ -11521,7 +11518,7 @@ static Expr *CheckMapClauseExpressionBase( if (RT->isUnionType()) { SemaRef.Diag(ELoc, diag::err_omp_union_type_not_allowed) << CurE->getSourceRange(); - break; + return nullptr; } // If we got a member expression, we should not expect any array section @@ -11535,18 +11532,14 @@ static Expr *CheckMapClauseExpressionBase( AllowWholeSizeArraySection = false; // Record the component. - CurComponents.push_back( - OMPClauseMappableExprCommon::MappableComponent(CurE, FD)); - continue; - } - - if (auto *CurE = dyn_cast<ArraySubscriptExpr>(E)) { + CurComponents.emplace_back(CurE, FD); + } else if (auto *CurE = dyn_cast<ArraySubscriptExpr>(E)) { E = CurE->getBase()->IgnoreParenImpCasts(); if (!E->getType()->isAnyPointerType() && !E->getType()->isArrayType()) { SemaRef.Diag(ELoc, diag::err_omp_expected_base_var_name) << 0 << CurE->getSourceRange(); - break; + return nullptr; } // If we got an array subscript that express the whole dimension we @@ -11557,15 +11550,11 @@ static Expr *CheckMapClauseExpressionBase( AllowWholeSizeArraySection = false; // Record the component - we don't have any declaration associated. - CurComponents.push_back( - OMPClauseMappableExprCommon::MappableComponent(CurE, nullptr)); - continue; - } - - if (auto *CurE = dyn_cast<OMPArraySectionExpr>(E)) { + CurComponents.emplace_back(CurE, nullptr); + } else if (auto *CurE = dyn_cast<OMPArraySectionExpr>(E)) { E = CurE->getBase()->IgnoreParenImpCasts(); - auto CurType = + QualType CurType = OMPArraySectionExpr::getBaseOriginalType(E).getCanonicalType(); // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C++, p.1] @@ -11579,7 +11568,7 @@ static Expr *CheckMapClauseExpressionBase( if (!IsPointer && !CurType->isArrayType()) { SemaRef.Diag(ELoc, diag::err_omp_expected_base_var_name) << 0 << CurE->getSourceRange(); - break; + return nullptr; } bool NotWhole = @@ -11602,20 +11591,18 @@ static Expr *CheckMapClauseExpressionBase( SemaRef.Diag( ELoc, diag::err_array_section_does_not_specify_contiguous_storage) << CurE->getSourceRange(); - break; + return nullptr; } // Record the component - we don't have any declaration associated. - CurComponents.push_back( - OMPClauseMappableExprCommon::MappableComponent(CurE, nullptr)); - continue; + CurComponents.emplace_back(CurE, nullptr); + } else { + // If nothing else worked, this is not a valid map clause expression. + SemaRef.Diag(ELoc, + diag::err_omp_expected_named_var_member_or_array_expression) + << ERange; + return nullptr; } - - // If nothing else worked, this is not a valid map clause expression. - SemaRef.Diag(ELoc, - diag::err_omp_expected_named_var_member_or_array_expression) - << ERange; - break; } return RelevantExpr; |