diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-20 00:39:05 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-20 00:39:05 +0300 |
commit | 6cd664c31086a934587c9bddc41904accd53578a (patch) | |
tree | cea29d605b52aa1b0b5277677b37b0cb83e052dd | |
parent | 79e89f5a26a0c19324217f79768d71ab46815a99 (diff) | |
download | paranucker-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.
-rw-r--r-- | src/analysis/statement.cpp | 14 |
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; |