summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-24 13:19:30 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-24 13:19:30 +0300
commit38cdb19d91e40f59d05717e89cfe628de53f95fe (patch)
treef31ad6c1d46e35c5e2d508b2cd7feda01b5e5d7a /src/analysis/expression.cpp
parent0115abd5dc7cc43a6e84c21bab03324fd37a5f32 (diff)
downloadparanucker-38cdb19d91e40f59d05717e89cfe628de53f95fe.tar.gz
paranucker-38cdb19d91e40f59d05717e89cfe628de53f95fe.tar.bz2
paranucker-38cdb19d91e40f59d05717e89cfe628de53f95fe.tar.xz
paranucker-38cdb19d91e40f59d05717e89cfe628de53f95fe.zip
Reorder child nodes in BIND_EXPR.
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 78b3d8e..54cf738 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -325,13 +325,24 @@ void analyseCompoundExpr(CompoundExprNode *node, const WalkItem &wi, WalkItem &w
// type var1 = var2;
void analyseBindExpr(BindExprNode *node, const WalkItem &wi, WalkItem &wo)
{
- // need one arg for check
- if (node->args.empty() || command == FindArgs)
+ const size_t sz = node->args.size();
+ if (sz < 1 || command == FindArgs)
return;
Log::dumpWI(node, "wo in ", wo);
- Node *node1 = skipNop(node->args[0]);
+ WalkItem wi2 = wi;
+ walkTree(node->args[1], wi2, wo);
+ wi2 = wo;
+ Log::dumpWI(node, "wi2 ", wi2);
+ walkTree(node->args[0], wi2, wo);
+ if (sz > 2)
+ {
+ wi2 = wo;
+ Log::dumpWI(node, "wi2 ", wi2);
+ walkTree(node->args[2], wi2, wo);
+ }
+ Node *node1 = skipNop(node->args[0]);
if (node1 &&
node1->nodeType == VAR_DECL)
{
@@ -343,6 +354,7 @@ void analyseBindExpr(BindExprNode *node, const WalkItem &wi, WalkItem &wo)
addLinkedVar(wo, initial->label, varDecl->label);
}
}
+ wo.stopWalking = true;
Log::dumpWI(node, "wo out ", wo);
}