compiler: use correct value type in 2-case select send
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 23 Jul 2019 17:20:36 +0000 (17:20 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 23 Jul 2019 17:20:36 +0000 (17:20 +0000)
    In the channel-send case, the value to be sent may needs an
    (implicit) type conversion to the channel element type. This CL
    ensures that we use the correct value type for the send.

    Fixes golang/go#33235.

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

From-SVN: r273743

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

index dabd5a30989c0dca34970591dabf05fa09800734..ba7282efde459375131829217ee89debddaec54c 100644 (file)
@@ -1,4 +1,4 @@
-b7bce0dbccb978d33eb8ce0bffc02fae2c2857c1
+480477ca64c3001b9c7e92ef8b978dc92a5912d2
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 27c4b95781d7aa532c86a2cb63179255ab2ff514..6d9c0eb2414e26eb2ff31ba6ef191a03014cc7b3 100644 (file)
@@ -5880,6 +5880,7 @@ Select_statement::lower_two_case(Block* b)
      : this->clauses_->at(1));
   Location loc = this->location();
   Expression* chan = chancase.channel();
+  Type* valtype = chan->type()->channel_type()->element_type();
 
   Temporary_statement* chantmp = Statement::make_temporary(NULL, chan, loc);
   b->add_statement(chantmp);
@@ -5891,7 +5892,8 @@ Select_statement::lower_two_case(Block* b)
     {
       // if selectnbsend(chan, &val) { body } else { default body }
 
-      Temporary_statement* ts = Statement::make_temporary(NULL, chancase.val(), loc);
+      Temporary_statement* ts =
+        Statement::make_temporary(valtype, chancase.val(), loc);
       // Tell the escape analysis that the value escapes, as it may be sent
       // to a channel.
       ts->set_value_escapes();
@@ -5904,7 +5906,6 @@ Select_statement::lower_two_case(Block* b)
     }
   else
     {
-      Type* valtype = chan->type()->channel_type()->element_type();
       Temporary_statement* ts = Statement::make_temporary(valtype, NULL, loc);
       b->add_statement(ts);