summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-21 01:38:37 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-21 01:38:37 +0300
commit105529f34d3f9b04661a8caf4842c0eeea9d1838 (patch)
tree93e10721c7fd27833bc4d124057f766d081c896a
parentea10f7bf8cadb21a392b06e1c7f50dcffca7ea89 (diff)
downloadparanucker-105529f34d3f9b04661a8caf4842c0eeea9d1838.tar.gz
paranucker-105529f34d3f9b04661a8caf4842c0eeea9d1838.tar.bz2
paranucker-105529f34d3f9b04661a8caf4842c0eeea9d1838.tar.xz
paranucker-105529f34d3f9b04661a8caf4842c0eeea9d1838.zip
fix COND_EXPR for C code.
In C code COND_EXPR used like IF_STMT in C++.
-rw-r--r--src/analysis/expression.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index c3d97cf..9f21577 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -261,6 +261,43 @@ void analyseCondExpr(CondExprNode *node, const WalkItem &wi, WalkItem &wo)
// need check for cleanExpr?
intersectNonNullChecked(wo, wo2, wo3);
+ wo.removeNullVars.clear();
+
+ if (wo2.isReturned)
+ {
+ // add variable for ignore for all parent nodes except special like IF_STMT
+ FOR_EACH (std::set<std::string>::const_iterator,
+ it,
+ wo1.checkedNullVars)
+ {
+ wo.removeNullVars.insert(*it);
+ wo.checkNullVars.erase(*it);
+ }
+ }
+ if (wo3.isReturned)
+ {
+ // add variable for ignore for all parent nodes except special like IF_STMT
+ FOR_EACH (std::set<std::string>::const_iterator,
+ it,
+ wo1.checkedNonNullVars)
+ {
+ wo.removeNullVars.insert(*it);
+ wo.checkNullVars.erase(*it);
+ }
+ }
+
+ if (wo2.isReturned && wo3.isReturned)
+ {
+ // add variable for ignore for all parent nodes except special like IF_STMT
+ FOR_EACH (std::set<std::string>::const_iterator,
+ it,
+ wo1.checkedNullVars)
+ {
+ wo.removeNullVars.insert(*it);
+ }
+ }
+
+ wo.isReturned = false;
wo.cleanExpr = true;
wo.stopWalking = true;
wo.uselessExpr = false;