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