diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Analysis/GRExprEngine.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index 418129caa92..e3fe2395535 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/lib/Analysis/GRExprEngine.cpp @@ -1840,13 +1840,20 @@ void GRExprEngine::HandleUndefinedStore(Stmt* S, NodeTy* Pred) { //===----------------------------------------------------------------------===// ValueState* GRExprEngine::Assume(ValueState* St, LVal Cond, - bool Assumption, - bool& isFeasible) { + bool Assumption, bool& isFeasible) { + + St = AssumeAux(St, Cond, Assumption, isFeasible); + return isFeasible ? St : TF->EvalAssume(St, Cond, Assumption); +} + +ValueState* GRExprEngine::AssumeAux(ValueState* St, LVal Cond, + bool Assumption, bool& isFeasible) { + switch (Cond.getSubKind()) { default: assert (false && "'Assume' not implemented for this LVal."); return St; - + case lval::SymbolValKind: if (Assumption) return AssumeSymNE(St, cast<lval::SymbolVal>(Cond).getSymbol(), @@ -1854,8 +1861,8 @@ ValueState* GRExprEngine::Assume(ValueState* St, LVal Cond, else return AssumeSymEQ(St, cast<lval::SymbolVal>(Cond).getSymbol(), BasicVals.getZeroWithPtrWidth(), isFeasible); - - + + case lval::DeclValKind: case lval::FuncValKind: case lval::GotoLabelKind: @@ -1871,8 +1878,14 @@ ValueState* GRExprEngine::Assume(ValueState* St, LVal Cond, } ValueState* GRExprEngine::Assume(ValueState* St, NonLVal Cond, - bool Assumption, - bool& isFeasible) { + bool Assumption, bool& isFeasible) { + + St = AssumeAux(St, Cond, Assumption, isFeasible); + return isFeasible ? St : TF->EvalAssume(St, Cond, Assumption); +} + +ValueState* GRExprEngine::AssumeAux(ValueState* St, NonLVal Cond, + bool Assumption, bool& isFeasible) { switch (Cond.getSubKind()) { default: assert (false && "'Assume' not implemented for this NonLVal."); |