Commit 40768ee0 by Ian Lance Taylor

compiler: use correct value type in 2-case select send

    
    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
parent 9bf40084
b7bce0dbccb978d33eb8ce0bffc02fae2c2857c1 480477ca64c3001b9c7e92ef8b978dc92a5912d2
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.
...@@ -5880,6 +5880,7 @@ Select_statement::lower_two_case(Block* b) ...@@ -5880,6 +5880,7 @@ Select_statement::lower_two_case(Block* b)
: this->clauses_->at(1)); : this->clauses_->at(1));
Location loc = this->location(); Location loc = this->location();
Expression* chan = chancase.channel(); Expression* chan = chancase.channel();
Type* valtype = chan->type()->channel_type()->element_type();
Temporary_statement* chantmp = Statement::make_temporary(NULL, chan, loc); Temporary_statement* chantmp = Statement::make_temporary(NULL, chan, loc);
b->add_statement(chantmp); b->add_statement(chantmp);
...@@ -5891,7 +5892,8 @@ Select_statement::lower_two_case(Block* b) ...@@ -5891,7 +5892,8 @@ Select_statement::lower_two_case(Block* b)
{ {
// if selectnbsend(chan, &val) { body } else { default body } // 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 // Tell the escape analysis that the value escapes, as it may be sent
// to a channel. // to a channel.
ts->set_value_escapes(); ts->set_value_escapes();
...@@ -5904,7 +5906,6 @@ Select_statement::lower_two_case(Block* b) ...@@ -5904,7 +5906,6 @@ Select_statement::lower_two_case(Block* b)
} }
else else
{ {
Type* valtype = chan->type()->channel_type()->element_type();
Temporary_statement* ts = Statement::make_temporary(valtype, NULL, loc); Temporary_statement* ts = Statement::make_temporary(valtype, NULL, loc);
b->add_statement(ts); b->add_statement(ts);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment