summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2017-12-05 15:22:49 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2017-12-05 15:22:49 +0000
commit27041fab7e9ed439918bea20b13633aab86e6e29 (patch)
treed5e9124c3b269a6df867824d0268de42821d83ff
parent0a436a9d6232f8e2a0334dcee2a5529c2b42f208 (diff)
downloadbcm5719-llvm-27041fab7e9ed439918bea20b13633aab86e6e29.tar.gz
bcm5719-llvm-27041fab7e9ed439918bea20b13633aab86e6e29.zip
[OPENMP] Fix assert fail after target implicit map checks.
If the error is generated during analysis of implicitly or explicitly mapped variables, it may cause compiler crash because of incorrect analysis. llvm-svn: 319774
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp59
-rw-r--r--clang/test/OpenMP/target_map_messages.cpp4
2 files changed, 27 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;
diff --git a/clang/test/OpenMP/target_map_messages.cpp b/clang/test/OpenMP/target_map_messages.cpp
index f607dcf3698..52a492920fb 100644
--- a/clang/test/OpenMP/target_map_messages.cpp
+++ b/clang/test/OpenMP/target_map_messages.cpp
@@ -269,6 +269,10 @@ void SAclient(int arg) {
{}
#pragma omp target map(u.B) // expected-error {{mapped storage cannot be derived from a union}}
{}
+ #pragma omp target
+ {
+ u.B = 0; // expected-error {{mapped storage cannot be derived from a union}}
+ }
#pragma omp target data map(to: r.C) //expected-note {{used here}}
{
OpenPOWER on IntegriCloud