compiler: load LHS subexpressions of op= assignment only once

Fixes golang/go#52811

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/405617
This commit is contained in:
Ian Lance Taylor 2022-05-10 17:05:08 -07:00
parent 2b0c837772
commit 1bfb823e2a
2 changed files with 11 additions and 1 deletions

View File

@ -1,4 +1,4 @@
f5bc28a30b7503015bbef38afb5812313184e822 9d07072e58ca4f9f05343dfd3475b9f49dae5ec5
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.

View File

@ -1260,6 +1260,16 @@ Assignment_operation_statement::do_lower(Gogo*, Named_object*,
Move_ordered_evals moe(b); Move_ordered_evals moe(b);
this->lhs_->traverse_subexpressions(&moe); this->lhs_->traverse_subexpressions(&moe);
// We can still be left with subexpressions that have to be loaded
// even if they don't have side effects themselves, in case the RHS
// changes variables named on the LHS.
int i;
if (this->lhs_->must_eval_subexpressions_in_order(&i))
{
Move_subexpressions ms(i, b);
this->lhs_->traverse_subexpressions(&ms);
}
Expression* lval = this->lhs_->copy(); Expression* lval = this->lhs_->copy();
Operator op; Operator op;