1// errorcheck -+
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 go:nowritebarrier and related directives.
8
9package p
10
11type t struct {
12	f *t
13}
14
15var x t
16var y *t
17
18//go:nowritebarrier
19func a1() {
20	x.f = y // ERROR "write barrier prohibited"
21	a2()    // no error
22}
23
24//go:noinline
25func a2() {
26	x.f = y
27}
28
29//go:nowritebarrierrec
30func b1() {
31	b2()
32}
33
34//go:noinline
35func b2() {
36	x.f = y // ERROR "write barrier prohibited by caller"
37}
38
39// Test recursive cycles through nowritebarrierrec and yeswritebarrierrec.
40
41//go:nowritebarrierrec
42func c1() {
43	c2()
44}
45
46//go:yeswritebarrierrec
47func c2() {
48	c3()
49}
50
51func c3() {
52	x.f = y
53	c4()
54}
55
56//go:nowritebarrierrec
57func c4() {
58	c2()
59}
60
61//go:nowritebarrierrec
62func d1() {
63	d2()
64}
65
66func d2() {
67	d3()
68}
69
70//go:noinline
71func d3() {
72	x.f = y // ERROR "write barrier prohibited by caller"
73	d4()
74}
75
76//go:yeswritebarrierrec
77func d4() {
78	d2()
79}
80
81//go:noinline
82func systemstack(func()) {}
83
84//go:nowritebarrierrec
85func e1() {
86	systemstack(e2)
87	systemstack(func() {
88		x.f = y // ERROR "write barrier prohibited by caller"
89	})
90}
91
92func e2() {
93	x.f = y // ERROR "write barrier prohibited by caller"
94}
95