From: Ian Lance Taylor Date: Tue, 24 Apr 2012 16:24:38 +0000 (+0000) Subject: compiler: Fix order of evalation for m[0] = len(m) when m is a map. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5ada012290883e98d76a3ac6dcd34e56d50057e3;p=gcc.git compiler: Fix order of evalation for m[0] = len(m) when m is a map. From-SVN: r186772 --- diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index ee68b69cc97..7bc0b557c9f 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -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();