]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix slicecopy return value for zero-width elements
authorMatthew Dempsky <mdempsky@google.com>
Tue, 30 Dec 2014 20:31:17 +0000 (12:31 -0800)
committerIan Lance Taylor <iant@golang.org>
Sun, 4 Jan 2015 01:59:59 +0000 (01:59 +0000)
Fixes #8620

Change-Id: Idb49e586919d21d07e94a39ed9ebb0562f403460
Reviewed-on: https://go-review.googlesource.com/2221
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/slice.go
test/fixedbugs/issue8620.go [new file with mode: 0644]

index 4fb2adc1f91087d324d7a9a9ea77f3b8b0847b22..e427a8b7cc2f742b79d343e2e8a75d4db1e2ae4d 100644 (file)
@@ -92,7 +92,7 @@ func growslice(t *slicetype, old sliceStruct, n int64) sliceStruct {
 }
 
 func slicecopy(to sliceStruct, fm sliceStruct, width uintptr) int {
-       if fm.len == 0 || to.len == 0 || width == 0 {
+       if fm.len == 0 || to.len == 0 {
                return 0
        }
 
@@ -101,6 +101,10 @@ func slicecopy(to sliceStruct, fm sliceStruct, width uintptr) int {
                n = to.len
        }
 
+       if width == 0 {
+               return n
+       }
+
        if raceenabled {
                callerpc := getcallerpc(unsafe.Pointer(&to))
                pc := funcPC(slicecopy)
diff --git a/test/fixedbugs/issue8620.go b/test/fixedbugs/issue8620.go
new file mode 100644 (file)
index 0000000..30d7a82
--- /dev/null
@@ -0,0 +1,30 @@
+// run
+
+// Copyright 2014 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 8620. Used to fail with -race.
+
+package main
+
+func min(a, b int) int {
+       if a < b {
+               return a
+       }
+       return b
+}
+
+func test(s1, s2 []struct{}) {
+       n := min(len(s1), len(s2))
+       if copy(s1, s2) != n {
+               panic("bad copy result")
+       }
+}
+
+func main() {
+       var b [100]struct{}
+       test(b[:], b[:])
+       test(b[1:], b[:])
+       test(b[:], b[2:])
+}