Commit 0db8d3df authored by Russ Cox's avatar Russ Cox

gc: select receive with implicit conversion

Fixes #1172.

R=ken2
CC=golang-dev
https://golang.org/cl/2615041
parent 6096fc83
......@@ -41,11 +41,18 @@ typecheckselect(Node *sel)
setlineno(n);
switch(n->op) {
default:
yyerror("select case must be receive, send or assign recv");;
yyerror("select case must be receive, send or assign recv");
break;
case OAS:
// convert x = <-c into OSELRECV(x, c)
// assignment might have introduced a
// conversion. throw it away.
// it will come back when the select code
// gets generated, because it always assigns
// through a temporary.
if((n->right->op == OCONVNOP || n->right->op == OCONVIFACE) && n->right->implicit)
n->right = n->right->left;
if(n->right->op != ORECV) {
yyerror("select assignment must have receive on right hand side");
break;
......
......@@ -1046,6 +1046,9 @@ Jconv(Fmt *fp)
if(n->isddd != 0)
fmtprint(fp, " isddd(%d)", n->isddd);
if(n->implicit != 0)
fmtprint(fp, " implicit(%d)", n->implicit);
return 0;
}
......@@ -2047,6 +2050,7 @@ assignconv(Node *n, Type *t, char *context)
r = nod(op, n, N);
r->type = t;
r->typecheck = 1;
r->implicit = 1;
return r;
}
......
// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// issue 1172
package main
func main() {
var i interface{}
c := make(chan int, 1)
c <- 1
select {
case i = <-c: // error on this line
}
if i != 1 {
println("bad i", i)
panic("BUG")
}
}
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