summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-20 20:56:34 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-20 20:56:34 +0300
commit55b526b5957de07cea7f89e345fda0277266e485 (patch)
tree0f8640b5881a7aba45192f5bf5f8c11d14964594 /src/analysis/expression.cpp
parent084f9fd98fffc2590ccd77b454f1117f5c3c6cdb (diff)
downloadparanucker-55b526b5957de07cea7f89e345fda0277266e485.tar.gz
paranucker-55b526b5957de07cea7f89e345fda0277266e485.tar.bz2
paranucker-55b526b5957de07cea7f89e345fda0277266e485.tar.xz
paranucker-55b526b5957de07cea7f89e345fda0277266e485.zip
Add support for ignore already checked vars in complex expressions.
Example: if (a && a->b) if (!a || a->b)
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 66e32ce..e205e7b 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -154,8 +154,11 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem
WalkItem wo1 = wo;
WalkItem wo2 = wo;
walkTree(node->args[0], wi, wo1);
- walkTree(node->args[1], wi, wo2);
Log::dumpWI(node, "wo1 ", wo1);
+ WalkItem wi2 = wi;
+ removeCheckNullVarsSet(wi2, wo1.checkedNullVars);
+ Log::dumpWI(node, "wi2 ", wi2);
+ walkTree(node->args[1], wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
// probably condition wrong
if (wo1.cleanExpr)
@@ -182,8 +185,11 @@ void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkIte
WalkItem wo1 = wo;
WalkItem wo2 = wo;
walkTree(node->args[0], wi, wo1);
- walkTree(node->args[1], wi, wo2);
Log::dumpWI(node, "wo1 ", wo1);
+ WalkItem wi2 = wi;
+ removeCheckNullVarsSet(wi2, wo1.checkedNonNullVars);
+ Log::dumpWI(node, "wi2 ", wi2);
+ walkTree(node->args[1], wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
wo.stopWalking = true;