1// errorcheck -+ -0 -l -d=wb
2
3// Copyright 2016 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Test write barrier elimination for notinheap.
8
9//go:build cgo
10
11package p
12
13import "runtime/cgo"
14
15type t1 struct {
16	x *nih
17	s []nih
18	y [1024]byte // Prevent write decomposition
19}
20
21type t2 struct {
22	x *ih
23	s []ih
24	y [1024]byte
25}
26
27type nih struct {
28	_ cgo.Incomplete
29	x uintptr
30}
31
32type ih struct { // In-heap type
33	x uintptr
34}
35
36var (
37	v1 t1
38	v2 t2
39
40	v1s []t1
41	v2s []t2
42)
43
44func f() {
45	// Test direct writes
46	v1.x = nil        // no barrier
47	v2.x = nil        // ERROR "write barrier"
48	v1.s = []nih(nil) // no barrier
49	v2.s = []ih(nil)  // ERROR "write barrier"
50}
51
52func g() {
53	// Test aggregate writes
54	v1 = t1{x: nil} // no barrier
55	v2 = t2{x: nil} // ERROR "write barrier"
56}
57
58func h() {
59	// Test copies and appends.
60	copy(v1s, v1s[1:])      // no barrier
61	copy(v2s, v2s[1:])      // ERROR "write barrier"
62	_ = append(v1s, v1s...) // no barrier
63	_ = append(v2s, v2s...) // ERROR "write barrier"
64}
65
66// Slice clearing
67
68var (
69	sliceIH  []*ih
70	sliceNIH []*nih
71)
72
73func sliceClear() {
74	for i := range sliceIH {
75		sliceIH[i] = nil // ERROR "write barrier"
76	}
77	for i := range sliceNIH {
78		sliceNIH[i] = nil // no barrier
79	}
80}
81