diff --git a/src/reflect/value.go b/src/reflect/value.go index a30d8f77..6ed8cbfc 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -1199,6 +1199,11 @@ func Copy(dst, src Value) int { panic("Copy: type mismatch: " + dst.typecode.String() + "/" + src.typecode.String()) } + // Can read from an unaddressable array but not write to one. + if dst.typecode.Kind() == Array && !dst.isIndirect() { + panic("reflect.Copy: unaddressable array value") + } + dstbuf, dstlen := buflen(dst) srcbuf, srclen := buflen(src) @@ -1216,10 +1221,10 @@ func buflen(v Value) (unsafe.Pointer, uintptr) { case Array: if v.isIndirect() { buf = v.value - len = uintptr(v.Len()) } else { - panic("reflect.Copy: unaddressable array value") + buf = unsafe.Pointer(&v.value) } + len = uintptr(v.Len()) case String: hdr := (*stringHeader)(v.value) buf = hdr.data