зеркало из https://github.com/microsoft/clang-1.git
Small fixes to shore up overhauling of transfer function logic for '&&' and '||.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47620 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
7695f70bbd
Коммит
58b3321009
|
@ -148,8 +148,8 @@ void GRExprEngine::ProcessBranch(Expr* Condition, Stmt* Term,
|
|||
break;
|
||||
|
||||
case RVal::UnknownKind:
|
||||
builder.generateNode(PrevState, true);
|
||||
builder.generateNode(PrevState, false);
|
||||
builder.generateNode(MarkBranch(PrevState, Term, true), true);
|
||||
builder.generateNode(MarkBranch(PrevState, Term, false), false);
|
||||
return;
|
||||
|
||||
case RVal::UninitializedKind: {
|
||||
|
@ -368,6 +368,13 @@ void GRExprEngine::VisitLogicalExpr(BinaryOperator* B, NodeTy* Pred,
|
|||
|
||||
X = GetBlkExprRVal(St, Ex);
|
||||
|
||||
// Handle uninitialized values.
|
||||
|
||||
if (X.isUninit()) {
|
||||
Nodify(Dst, B, Pred, SetBlkExprRVal(St, B, X));
|
||||
return;
|
||||
}
|
||||
|
||||
// We took the RHS. Because the value of the '&&' or '||' expression must
|
||||
// evaluate to 0 or 1, we must assume the value of the RHS evaluates to 0
|
||||
// or 1. Alternatively, we could take a lazy approach, and calculate this
|
||||
|
|
|
@ -336,12 +336,16 @@ RVal ValueStateManager::GetRVal(ValueState St, Expr* E) {
|
|||
|
||||
ValueState::ExprBindingsTy::TreeTy* T = St->SubExprBindings.SlimFind(E);
|
||||
|
||||
return T ? T->getValue().second : GetBlkExprRVal(St, E);
|
||||
if (T)
|
||||
return T->getValue().second;
|
||||
|
||||
T = St->BlockExprBindings.SlimFind(E);
|
||||
return T ? T->getValue().second : UnknownVal();
|
||||
}
|
||||
|
||||
RVal ValueStateManager::GetBlkExprRVal(ValueState St, Expr* E) {
|
||||
|
||||
assert (!isa<ParenExpr>(E));
|
||||
E = E->IgnoreParens();
|
||||
|
||||
switch (E->getStmtClass()) {
|
||||
case Stmt::CharacterLiteralClass: {
|
||||
|
|
Загрузка…
Ссылка в новой задаче