mirror of
https://github.com/golang/go
synced 2024-11-11 20:20:23 -07:00
316e3036a7
Currently (*Type).HasHeapPointer only ignores pointers go:notinheap types if the type itself is a pointer to a go:notinheap type. However, if it's some other type that contains pointers where all of those pointers are go:notinheap, it will conservatively return true. As a result, we'll use write barriers where they aren't needed, for example calling typedmemmove instead of just memmove on structs that contain only go:notinheap pointers. Fix this by making HasHeapPointer walk the whole type looking for pointers that aren't marked go:notinheap. Change-Id: Ib8c6abf6f7a20f34969d1d402c5498e0b990be59 Reviewed-on: https://go-review.googlesource.com/73412 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
46 lines
694 B
Go
46 lines
694 B
Go
// errorcheck -+ -0 -l -d=wb
|
|
|
|
// Copyright 2016 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.
|
|
|
|
// Test write barrier elimination for notinheap.
|
|
|
|
package p
|
|
|
|
type t1 struct {
|
|
x *nih
|
|
y [1024]byte // Prevent write decomposition
|
|
}
|
|
|
|
type t2 struct {
|
|
x *ih
|
|
y [1024]byte
|
|
}
|
|
|
|
//go:notinheap
|
|
type nih struct {
|
|
x uintptr
|
|
}
|
|
|
|
type ih struct { // In-heap type
|
|
x uintptr
|
|
}
|
|
|
|
var (
|
|
v1 t1
|
|
v2 t2
|
|
)
|
|
|
|
func f() {
|
|
// Test direct writes
|
|
v1.x = nil // no barrier
|
|
v2.x = nil // ERROR "write barrier"
|
|
}
|
|
|
|
func g() {
|
|
// Test aggregate writes
|
|
v1 = t1{x: nil} // no barrier
|
|
v2 = t2{x: nil} // ERROR "write barrier"
|
|
}
|