]> Cypherpunks repositories - gostls13.git/commitdiff
gc: select receive with implicit conversion
authorRuss Cox <rsc@golang.org>
Wed, 20 Oct 2010 20:38:25 +0000 (16:38 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 20 Oct 2010 20:38:25 +0000 (16:38 -0400)
Fixes #1172.

R=ken2
CC=golang-dev
https://golang.org/cl/2615041

src/cmd/gc/select.c
src/cmd/gc/subr.c
test/fixedbugs/bug312.go [new file with mode: 0644]

index 2fa435316543c41f4d53a62bd7dbcf5638090ada..1a37713114a1b24ee93690fe9b0c03e3a6dca63a 100644 (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;
index ea41a1b7c4d7cba1bc95614f50b9201d11642bcc..1fdc54e451817a2886c80ef2f82310ee9f7a0eef 100644 (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;
 }
 
diff --git a/test/fixedbugs/bug312.go b/test/fixedbugs/bug312.go
new file mode 100644 (file)
index 0000000..70888dd
--- /dev/null
@@ -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")
+       }
+}