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