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