aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2014-12-30 12:31:17 -0800
committerIan Lance Taylor <iant@golang.org>2015-01-04 01:59:59 +0000
commit537ddc945685cea6fd2f3cbc8bfc6f69616671fd (patch)
tree941db3fb02bbf154b6cf3f740639ffd3b8acc1d4
parent865e5e98b685eb3a7888f5263021049c0694d16f (diff)
downloadgo-537ddc945685cea6fd2f3cbc8bfc6f69616671fd.tar.xz
runtime: fix slicecopy return value for zero-width elements
Fixes #8620 Change-Id: Idb49e586919d21d07e94a39ed9ebb0562f403460 Reviewed-on: https://go-review.googlesource.com/2221 Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/runtime/slice.go6
-rw-r--r--test/fixedbugs/issue8620.go30
2 files changed, 35 insertions, 1 deletions
diff --git a/src/runtime/slice.go b/src/runtime/slice.go
index 4fb2adc1f9..e427a8b7cc 100644
--- a/src/runtime/slice.go
+++ b/src/runtime/slice.go
@@ -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
index 0000000000..30d7a820ac
--- /dev/null
+++ b/test/fixedbugs/issue8620.go
@@ -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:])
+}