From 537ddc945685cea6fd2f3cbc8bfc6f69616671fd Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 30 Dec 2014 12:31:17 -0800 Subject: [PATCH] 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 --- src/runtime/slice.go | 6 +++++- test/fixedbugs/issue8620.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue8620.go 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:]) +} -- 2.50.0