compiler: load LHS subexpressions of op= assignment only once
Fixes golang/go#52811
Change-Id: I369415d1188a483cba81257fdfbb0e5c1a7df1c4
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/405617
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
diff --git a/go/statements.cc b/go/statements.cc
index 95fa3c4..b3db843 100644
--- a/go/statements.cc
+++ b/go/statements.cc
@@ -1260,6 +1260,16 @@
Move_ordered_evals moe(b);
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();
Operator op;