Commit 5ada0122 by Ian Lance Taylor

compiler: Fix order of evalation for m[0] = len(m) when m is a map.

From-SVN: r186772
parent 24d5b351
......@@ -2216,12 +2216,18 @@ Order_eval::statement(Block* block, size_t* pindex, Statement* s)
Expression::traverse(&init, &find_eval_ordering);
}
if (find_eval_ordering.size() <= 1)
{
// If there is only one expression with a side-effect, we can
// leave it in place.
return TRAVERSE_CONTINUE;
}
size_t c = find_eval_ordering.size();
if (c == 0)
return TRAVERSE_CONTINUE;
// If there is only one expression with a side-effect, we can
// usually leave it in place. However, for an assignment statement,
// we need to evaluate an expression on the right hand side before
// we evaluate any index expression on the left hand side, so for
// that case we always move the expression. Otherwise we mishandle
// m[0] = len(m) where m is a map.
if (c == 1 && s->classification() != Statement::STATEMENT_ASSIGNMENT)
return TRAVERSE_CONTINUE;
bool is_thunk = s->thunk_statement() != NULL;
for (Find_eval_ordering::const_iterator p = find_eval_ordering.begin();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment