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