aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorChris Hamilton <Chris.Hamilton@ericsson.com>2020-09-29 22:34:46 +0200
committerChris Hamilton <Chris.Hamilton@ericsson.com>2020-09-29 22:46:14 +0200
commit155d2d5300551c6ac26eaeef259d73d62f939d0b (patch)
tree7346d380022e21ec036d3efce50ff7479bea9d73 /clang/lib/Sema/SemaChecking.cpp
parent538762fef0b662048be2a261ebc12da249efa977 (diff)
downloadllvm-155d2d5300551c6ac26eaeef259d73d62f939d0b.zip
llvm-155d2d5300551c6ac26eaeef259d73d62f939d0b.tar.gz
llvm-155d2d5300551c6ac26eaeef259d73d62f939d0b.tar.bz2
Revert "[Sema] Address-space sensitive check for unbounded arrays (v2)"
This reverts commit d9ee935679e7164d1c47e351bbbcf5c25742b59c.
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp89
1 files changed, 13 insertions, 76 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index a5de6a5..eeb3222 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -14057,11 +14057,11 @@ void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
const ConstantArrayType *ArrayTy =
Context.getAsConstantArrayType(BaseExpr->getType());
- const Type *BaseType =
- ArrayTy == nullptr ? nullptr : ArrayTy->getElementType().getTypePtr();
- bool IsUnboundedArray = (BaseType == nullptr);
- if (EffectiveType->isDependentType() ||
- (!IsUnboundedArray && BaseType->isDependentType()))
+ if (!ArrayTy)
+ return;
+
+ const Type *BaseType = ArrayTy->getElementType().getTypePtr();
+ if (EffectiveType->isDependentType() || BaseType->isDependentType())
return;
Expr::EvalResult Result;
@@ -14069,10 +14069,8 @@ void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
return;
llvm::APSInt index = Result.Val.getInt();
- if (IndexNegated) {
- index.setIsUnsigned(false);
+ if (IndexNegated)
index = -index;
- }
const NamedDecl *ND = nullptr;
if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(BaseExpr))
@@ -14080,69 +14078,6 @@ void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
if (const MemberExpr *ME = dyn_cast<MemberExpr>(BaseExpr))
ND = ME->getMemberDecl();
- if (IsUnboundedArray) {
- if (index.isUnsigned() || !index.isNegative()) {
- const auto &ASTC = getASTContext();
- unsigned AddrBits =
- ASTC.getTargetInfo().getPointerWidth(ASTC.getTargetAddressSpace(
- EffectiveType->getCanonicalTypeInternal()));
- if (index.getBitWidth() < AddrBits)
- index = index.zext(AddrBits);
- CharUnits ElemCharUnits = ASTC.getTypeSizeInChars(EffectiveType);
- llvm::APInt ElemBytes(index.getBitWidth(), ElemCharUnits.getQuantity());
- // If index has more active bits than address space, we already know
- // we have a bounds violation to warn about. Otherwise, compute
- // address of (index + 1)th element, and warn about bounds violation
- // only if that address exceeds address space.
- if (index.getActiveBits() <= AddrBits) {
- bool Overflow;
- llvm::APInt Product(index);
- Product += 1;
- Product = Product.umul_ov(ElemBytes, Overflow);
- if (!Overflow && Product.getActiveBits() <= AddrBits)
- return;
- }
-
- // Need to compute max possible elements in address space, since that
- // is included in diag message.
- llvm::APInt MaxElems = llvm::APInt::getMaxValue(AddrBits);
- MaxElems = MaxElems.zext(std::max(AddrBits + 1, ElemBytes.getBitWidth()));
- MaxElems += 1;
- ElemBytes = ElemBytes.zextOrTrunc(MaxElems.getBitWidth());
- MaxElems = MaxElems.udiv(ElemBytes);
-
- unsigned DiagID =
- ASE ? diag::warn_array_index_exceeds_max_addressable_bounds
- : diag::warn_ptr_arith_exceeds_max_addressable_bounds;
-
- // Diag message shows element size in bits and in "bytes" (platform-
- // dependent CharUnits)
- DiagRuntimeBehavior(BaseExpr->getBeginLoc(), BaseExpr,
- PDiag(DiagID)
- << index.toString(10, true) << AddrBits
- << (unsigned)ASTC.toBits(ElemCharUnits)
- << ElemBytes.toString(10, false)
- << MaxElems.toString(10, false)
- << (unsigned)MaxElems.getLimitedValue(~0U)
- << IndexExpr->getSourceRange());
-
- if (!ND) {
- // Try harder to find a NamedDecl to point at in the note.
- while (const auto *ASE = dyn_cast<ArraySubscriptExpr>(BaseExpr))
- BaseExpr = ASE->getBase()->IgnoreParenCasts();
- if (const auto *DRE = dyn_cast<DeclRefExpr>(BaseExpr))
- ND = DRE->getDecl();
- if (const auto *ME = dyn_cast<MemberExpr>(BaseExpr))
- ND = ME->getMemberDecl();
- }
-
- if (ND)
- DiagRuntimeBehavior(ND->getBeginLoc(), BaseExpr,
- PDiag(diag::note_array_declared_here) << ND);
- }
- return;
- }
-
if (index.isUnsigned() || !index.isNegative()) {
// It is possible that the type of the base expression after
// IgnoreParenCasts is incomplete, even though the type of the base
@@ -14205,8 +14140,9 @@ void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
}
}
- unsigned DiagID = ASE ? diag::warn_array_index_exceeds_bounds
- : diag::warn_ptr_arith_exceeds_bounds;
+ unsigned DiagID = diag::warn_ptr_arith_exceeds_bounds;
+ if (ASE)
+ DiagID = diag::warn_array_index_exceeds_bounds;
DiagRuntimeBehavior(BaseExpr->getBeginLoc(), BaseExpr,
PDiag(DiagID) << index.toString(10, true)
@@ -14227,11 +14163,12 @@ void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr,
if (!ND) {
// Try harder to find a NamedDecl to point at in the note.
- while (const auto *ASE = dyn_cast<ArraySubscriptExpr>(BaseExpr))
+ while (const ArraySubscriptExpr *ASE =
+ dyn_cast<ArraySubscriptExpr>(BaseExpr))
BaseExpr = ASE->getBase()->IgnoreParenCasts();
- if (const auto *DRE = dyn_cast<DeclRefExpr>(BaseExpr))
+ if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(BaseExpr))
ND = DRE->getDecl();
- if (const auto *ME = dyn_cast<MemberExpr>(BaseExpr))
+ if (const MemberExpr *ME = dyn_cast<MemberExpr>(BaseExpr))
ND = ME->getMemberDecl();
}