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:
parent
6096fc83cd
commit
0db8d3df4c
@ -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;
|
||||
}
|
||||
|
||||
|
22
test/fixedbugs/bug312.go
Normal file
22
test/fixedbugs/bug312.go
Normal 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")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user