| // errorcheck -0 -l -d=wb | |
| // Copyright 2017 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. | |
| package p | |
| import ( | |
| "reflect" | |
| "unsafe" | |
| reflect2 "reflect" | |
| ) | |
| func sink(e interface{}) | |
| func a(hdr *reflect.SliceHeader, p *byte) { | |
| hdr.Data = uintptr(unsafe.Pointer(p)) // ERROR "write barrier" | |
| } | |
| func b(hdr *reflect.StringHeader, p *byte) { | |
| hdr.Data = uintptr(unsafe.Pointer(p)) // ERROR "write barrier" | |
| } | |
| func c(hdrs *[1]reflect.SliceHeader, p *byte) { | |
| hdrs[0].Data = uintptr(unsafe.Pointer(p)) // ERROR "write barrier" | |
| } | |
| func d(hdr *struct{ s reflect.StringHeader }, p *byte) { | |
| hdr.s.Data = uintptr(unsafe.Pointer(p)) // ERROR "write barrier" | |
| } | |
| func e(p *byte) (resHeap, resStack string) { | |
| sink(&resHeap) | |
| hdr := (*reflect.StringHeader)(unsafe.Pointer(&resHeap)) | |
| hdr.Data = uintptr(unsafe.Pointer(p)) // ERROR "write barrier" | |
| // No write barrier for non-escaping stack vars. | |
| hdr = (*reflect.StringHeader)(unsafe.Pointer(&resStack)) | |
| hdr.Data = uintptr(unsafe.Pointer(p)) | |
| return | |
| } | |
| func f(hdr *reflect2.SliceHeader, p *byte) { | |
| hdr.Data = uintptr(unsafe.Pointer(p)) // ERROR "write barrier" | |
| } | |
| type SliceHeader struct { | |
| Data uintptr | |
| } | |
| func g(hdr *SliceHeader, p *byte) { | |
| // No write barrier for lookalike SliceHeader. | |
| hdr.Data = uintptr(unsafe.Pointer(p)) | |
| } |