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>
This commit is contained in:
Matthew Dempsky 2014-12-30 12:31:17 -08:00 committed by Ian Lance Taylor
parent 865e5e98b6
commit 537ddc9456
2 changed files with 35 additions and 1 deletions

View 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)

View file

@ -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:])
}