1
0
mirror of https://github.com/golang/go synced 2024-11-23 21:10:05 -07:00

gc: select receive with implicit conversion

Fixes #1172.

R=ken2
CC=golang-dev
https://golang.org/cl/2615041
This commit is contained in:
Russ Cox 2010-10-20 16:38:25 -04:00
parent 6096fc83cd
commit 0db8d3df4c
3 changed files with 34 additions and 1 deletions

View File

@ -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;

View File

@ -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;
}

22
test/fixedbugs/bug312.go Normal file
View File

@ -0,0 +1,22 @@
// $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")
}
}