diff mbox series

Go patch committed: Use correct assignment order for type assertions

Message ID CAOyqgcUhW0phQ-sHKdmLDf_N+utoeFW82EKDTc3XR1KWYkRR7A@mail.gmail.com
State New
Headers show
Series Go patch committed: Use correct assignment order for type assertions | expand

Commit Message

Ian Lance Taylor Nov. 30, 2020, 8:11 p.m. UTC
This patch to the Go frontend uses the use correct assignment order
for type assertions.  For "a, b := v.(T)" we must set a before b.
This is for https://golang.org/issue/13433.  Bootstrapped and ran Go
testsuite on x86_64-pc-linux-gnu.  Committed to mainline.

Ian
c7f272e05e1cf8c7d7caefe5ee542845cf4cc7c8
diff mbox series

Patch

diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 698969fc8c8..e2fc0b5560b 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@ 
-af683486b4de5503b2b6d9ae974a2ab1eeb92290
+213abeedc85ed638a878f9457e422897fda3a111
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index ad898070f6e..25e25364cee 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -1985,18 +1985,42 @@  Tuple_type_guard_assignment_statement::lower_to_object_type(
 							    NULL, loc);
   b->add_statement(val_temp);
 
-  // ok = CODE(type_descriptor, expr, &val_temp)
+  // var ok_temp bool
+  Temporary_statement* ok_temp = NULL;
+  if (!this->ok_->is_sink_expression())
+    {
+      ok_temp = Statement::make_temporary(this->ok_->type(),
+					  NULL, loc);
+      b->add_statement(ok_temp);
+    }
+
+  // ok_temp = CODE(type_descriptor, expr, &val_temp)
   Expression* p1 = Expression::make_type_descriptor(this->type_, loc);
   Expression* ref = Expression::make_temporary_reference(val_temp, loc);
   Expression* p3 = Expression::make_unary(OPERATOR_AND, ref, loc);
   Expression* call = Runtime::make_call(code, loc, 3, p1, this->expr_, p3);
-  Statement* s = Statement::make_assignment(this->ok_, call, loc);
+  Statement* s;
+  if (ok_temp == NULL)
+    s = Statement::make_statement(call, true);
+  else
+    {
+      Expression* ok_ref = Expression::make_temporary_reference(ok_temp, loc);
+      s = Statement::make_assignment(ok_ref, call, loc);
+    }
   b->add_statement(s);
 
   // val = val_temp
   ref = Expression::make_temporary_reference(val_temp, loc);
   s = Statement::make_assignment(this->val_, ref, loc);
   b->add_statement(s);
+
+  // ok = ok_temp
+  if (ok_temp != NULL)
+    {
+      ref = Expression::make_temporary_reference(ok_temp, loc);
+      s = Statement::make_assignment(this->ok_, ref, loc);
+      b->add_statement(s);
+    }
 }
 
 // Dump the AST representation for a tuple type guard statement.