summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-30 21:05:35 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-30 21:05:35 +0000
commit84dea154fc065fa2c32aec8ddf0b0cb7366f5a7e (patch)
tree5c04a9abd51c6baacf20aaee29f644c5caa8b2e5 /clang/lib
parent20d8006e93694160ac4b9e0f0f25a093cb34c20f (diff)
downloadbcm5719-llvm-84dea154fc065fa2c32aec8ddf0b0cb7366f5a7e.tar.gz
bcm5719-llvm-84dea154fc065fa2c32aec8ddf0b0cb7366f5a7e.zip
When creating LVals for array entries, canonicalize entries with a 0 index.
llvm-svn: 50497
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Analysis/GRExprEngine.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp
index 80e9af31900..877bd09a289 100644
--- a/clang/lib/Analysis/GRExprEngine.cpp
+++ b/clang/lib/Analysis/GRExprEngine.cpp
@@ -803,7 +803,15 @@ void GRExprEngine::VisitArraySubscriptExpr(ArraySubscriptExpr* A, NodeTy* Pred,
ValueState* St = GetState(*I2);
RVal BaseV = GetRVal(St, Base);
RVal IdxV = GetRVal(St, Idx);
- RVal V = lval::ArrayOffset::Make(BasicVals, BaseV, IdxV);
+
+ // If IdxV is 0, return just BaseV.
+
+ bool useBase = false;
+
+ if (nonlval::ConcreteInt* IdxInt = dyn_cast<nonlval::ConcreteInt>(&IdxV))
+ useBase = IdxInt->getValue() == 0;
+
+ RVal V = useBase ? BaseV : lval::ArrayOffset::Make(BasicVals, BaseV,IdxV);
if (asLVal)
MakeNode(Dst, A, *I2, SetRVal(St, A, V));
OpenPOWER on IntegriCloud