diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-12-16 19:31:14 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-12-16 19:31:14 +0000 |
commit | 13f6718b428fc5c4b966b6d47bc52aa3d6d36191 (patch) | |
tree | af787fc1c45a64df9b6af1cc1a27361dae7aa3dd /clang/lib/Sema/SemaChecking.cpp | |
parent | 6bb2f1d5b542a0fef88c841a12ff46e8a4877ca2 (diff) | |
download | bcm5719-llvm-13f6718b428fc5c4b966b6d47bc52aa3d6d36191.tar.gz bcm5719-llvm-13f6718b428fc5c4b966b6d47bc52aa3d6d36191.zip |
PR11594: Don't blindly build a UnaryOperator UO_Minus on an expression which
might not be an rvalue when checking array accesses. Instead, pass through a
flag indicating the array index is negated.
llvm-svn: 146753
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index c8f2d05e0d4..9bb532b5329 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4277,7 +4277,7 @@ static bool IsTailPaddedMemberArray(Sema &S, llvm::APInt Size, void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr, const ArraySubscriptExpr *ASE, - bool AllowOnePastEnd) { + bool AllowOnePastEnd, bool IndexNegated) { IndexExpr = IndexExpr->IgnoreParenCasts(); if (IndexExpr->isValueDependent()) return; @@ -4292,6 +4292,8 @@ void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr, llvm::APSInt index; if (!IndexExpr->EvaluateAsInt(index, Context)) return; + if (IndexNegated) + index = -index; const NamedDecl *ND = NULL; if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(BaseExpr)) |