diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 13:16:40 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 13:16:40 +0000 |
commit | 47ab3d4a42e9ab51c465c4322d2ec233f6324e6b (patch) | |
tree | a61a0ffd83f4a3def4b36e5c8e99630c559aa723 /test/nowritebarrier.go | |
parent | Initial commit. (diff) | |
download | golang-1.18-47ab3d4a42e9ab51c465c4322d2ec233f6324e6b.tar.xz golang-1.18-47ab3d4a42e9ab51c465c4322d2ec233f6324e6b.zip |
Adding upstream version 1.18.10.upstream/1.18.10upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'test/nowritebarrier.go')
-rw-r--r-- | test/nowritebarrier.go | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/test/nowritebarrier.go b/test/nowritebarrier.go new file mode 100644 index 0000000..654f16d --- /dev/null +++ b/test/nowritebarrier.go @@ -0,0 +1,94 @@ +// errorcheck -+ + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test go:nowritebarrier and related directives. + +package p + +type t struct { + f *t +} + +var x t +var y *t + +//go:nowritebarrier +func a1() { + x.f = y // ERROR "write barrier prohibited" + a2() // no error +} + +//go:noinline +func a2() { + x.f = y +} + +//go:nowritebarrierrec +func b1() { + b2() +} + +//go:noinline +func b2() { + x.f = y // ERROR "write barrier prohibited by caller" +} + +// Test recursive cycles through nowritebarrierrec and yeswritebarrierrec. + +//go:nowritebarrierrec +func c1() { + c2() +} + +//go:yeswritebarrierrec +func c2() { + c3() +} + +func c3() { + x.f = y + c4() +} + +//go:nowritebarrierrec +func c4() { + c2() +} + +//go:nowritebarrierrec +func d1() { + d2() +} + +func d2() { + d3() +} + +//go:noinline +func d3() { + x.f = y // ERROR "write barrier prohibited by caller" + d4() +} + +//go:yeswritebarrierrec +func d4() { + d2() +} + +//go:noinline +func systemstack(func()) {} + +//go:nowritebarrierrec +func e1() { + systemstack(e2) + systemstack(func() { + x.f = y // ERROR "write barrier prohibited by caller" + }) +} + +func e2() { + x.f = y // ERROR "write barrier prohibited by caller" +} |