blob: 5ace8d6793f21bdb87252f7425143fd31f9b454c [file] [log] [blame]
// 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
s []nih
y [1024]byte // Prevent write decomposition
}
type t2 struct {
x *ih
s []ih
y [1024]byte
}
//go:notinheap
type nih struct {
x uintptr
}
type ih struct { // In-heap type
x uintptr
}
var (
v1 t1
v2 t2
v1s []t1
v2s []t2
)
func f() {
// Test direct writes
v1.x = nil // no barrier
v2.x = nil // ERROR "write barrier"
v1.s = []nih(nil) // no barrier
v2.s = []ih(nil) // ERROR "write barrier"
}
func g() {
// Test aggregate writes
v1 = t1{x: nil} // no barrier
v2 = t2{x: nil} // ERROR "write barrier"
}
func h() {
// Test copies and appends.
copy(v1s, v1s[1:]) // no barrier
copy(v2s, v2s[1:]) // ERROR "write barrier"
_ = append(v1s, v1s...) // no barrier
_ = append(v2s, v2s...) // ERROR "write barrier"
}
// Slice clearing
var (
sliceIH []*ih
sliceNIH []*nih
)
func sliceClear() {
for i := range sliceIH {
sliceIH[i] = nil // ERROR "write barrier"
}
for i := range sliceNIH {
sliceNIH[i] = nil // no barrier
}
}