summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-20 21:08:00 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-20 21:08:00 +0300
commit06f64c3e2bcb6433157ac095f95ba4de8f3ea9a5 (patch)
tree724f51ea6819bdde84f1c159a9bf1420e515d91a
parent792ca12e0862a95d6a9bb9e9095d03a7553ba899 (diff)
downloadparanucker-06f64c3e2bcb6433157ac095f95ba4de8f3ea9a5.tar.gz
paranucker-06f64c3e2bcb6433157ac095f95ba4de8f3ea9a5.tar.bz2
paranucker-06f64c3e2bcb6433157ac095f95ba4de8f3ea9a5.tar.xz
paranucker-06f64c3e2bcb6433157ac095f95ba4de8f3ea9a5.zip
Add support for not ignore already checked vars in complex expressions.
Example: if (!a && a->b) if (a || a->b)
-rw-r--r--src/analysis/expression.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index e205e7b..506aef4 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -157,6 +157,8 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem
Log::dumpWI(node, "wo1 ", wo1);
WalkItem wi2 = wi;
removeCheckNullVarsSet(wi2, wo1.checkedNullVars);
+ wi2.checkNullVars.insert(wo1.checkedNonNullVars.begin(),
+ wo1.checkedNonNullVars.end());
Log::dumpWI(node, "wi2 ", wi2);
walkTree(node->args[1], wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
@@ -188,6 +190,8 @@ void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkIte
Log::dumpWI(node, "wo1 ", wo1);
WalkItem wi2 = wi;
removeCheckNullVarsSet(wi2, wo1.checkedNonNullVars);
+ wi2.checkNullVars.insert(wo1.checkedNullVars.begin(),
+ wo1.checkedNullVars.end());
Log::dumpWI(node, "wi2 ", wi2);
walkTree(node->args[1], wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);