diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-30 21:05:35 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-30 21:05:35 +0000 |
commit | 84dea154fc065fa2c32aec8ddf0b0cb7366f5a7e (patch) | |
tree | 5c04a9abd51c6baacf20aaee29f644c5caa8b2e5 /clang/lib | |
parent | 20d8006e93694160ac4b9e0f0f25a093cb34c20f (diff) | |
download | bcm5719-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.cpp | 10 |
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)); |