| // 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)) |
| } |