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