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