]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: return zero value in x, ok = <-c when ok == false
authorRuss Cox <rsc@golang.org>
Wed, 16 Dec 2009 00:59:23 +0000 (16:59 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 16 Dec 2009 00:59:23 +0000 (16:59 -0800)
Fixes #401.

R=ken2
https://golang.org/cl/180053

src/pkg/runtime/chan.c
test/fixedbugs/bug234.go [new file with mode: 0644]

index 633ff426e883f30bdf5638ec7437341e4f072cf0..f0202cf66b5eba45c9ec06a61e0a838a41bfe409 100644 (file)
@@ -307,6 +307,7 @@ loop:
 
        if(pres != nil) {
                unlock(c);
+               c->elemalg->copy(c->elemsize, ep, nil);
                *pres = false;
                return;
        }
@@ -335,6 +336,7 @@ asynch:
 
                if(pres != nil) {
                        unlock(c);
+                       c->elemalg->copy(c->elemsize, ep, nil);
                        *pres = false;
                        return;
                }
diff --git a/test/fixedbugs/bug234.go b/test/fixedbugs/bug234.go
new file mode 100644 (file)
index 0000000..882bc74
--- /dev/null
@@ -0,0 +1,20 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 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.
+
+package main
+
+func main() {
+       c := make(chan int, 1)
+       c <- 100
+       x, ok := <-c
+       if x != 100 || !ok {
+               panic("x=", x, " ok=", ok, " want 100, true")
+       }
+       x, ok = <-c
+       if x != 0 || ok {
+               panic("x=", x, " ok=", ok, " want 0, false")
+       }
+}