summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-20 00:39:05 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-20 00:39:05 +0300
commit6cd664c31086a934587c9bddc41904accd53578a (patch)
treecea29d605b52aa1b0b5277677b37b0cb83e052dd /src
parent79e89f5a26a0c19324217f79768d71ab46815a99 (diff)
downloadparanucker-6cd664c31086a934587c9bddc41904accd53578a.tar.gz
paranucker-6cd664c31086a934587c9bddc41904accd53578a.tar.bz2
paranucker-6cd664c31086a934587c9bddc41904accd53578a.tar.xz
paranucker-6cd664c31086a934587c9bddc41904accd53578a.zip
Detect what variable is non null after if with both branches set variable to non null value.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/statement.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 0f9f2eb..f405c2c 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -150,7 +150,7 @@ void analyseCondition(Node *node,
removeKnownNullVars2(wo3, wo);
}
if ((wo2.isReturned || wo2.isContinued) && (wo3.isReturned || wo3.isContinued))
- {
+ { // all branches returned or breaked
// add variable for ignore for all parent nodes except special like IF_STMT
FOR_EACH (it, wo.knownVars)
{
@@ -159,6 +159,18 @@ void analyseCondition(Node *node,
wo.knownNonNullVars.erase(it);
}
}
+ else if (thenNode && elseNode)
+ { // non branches returned or breaked
+ FOR_EACH (it, wo2.knownNonNullVars)
+ {
+ if (isIn(it, wo3.knownNonNullVars) &&
+ isNotIn(it, wo.knownNonNullVars))
+ { // check if var in both branches known as non null
+ removeNeedCheckNullVarOnly(wo, it);
+ addNonNullVar(wo, it);
+ }
+ }
+ }
wo.isReturned = false;
wo.isContinued = false;