]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: load LHS subexpressions of op= assignment only once
authorIan Lance Taylor <iant@golang.org>
Wed, 11 May 2022 00:05:08 +0000 (17:05 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 17 May 2022 22:48:43 +0000 (15:48 -0700)
Fixes golang/go#52811

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/405617

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/statements.cc

index daa725f9de9c14dacb3a662fbe7951e9028e8971..5fa8becde3e4ef8e8af40f3205d99d472ecc0b69 100644 (file)
@@ -1,4 +1,4 @@
-f5bc28a30b7503015bbef38afb5812313184e822
+9d07072e58ca4f9f05343dfd3475b9f49dae5ec5
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 95fa3c48709e78733dcb8681b0f5f8a9a5c5e6ff..b3db843365e1be40da9113332274a5e9dc773035 100644 (file)
@@ -1260,6 +1260,16 @@ Assignment_operation_statement::do_lower(Gogo*, Named_object*,
   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;