--- /dev/null
+// Copyright 2023 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.
+
+package runtime_test
+
+import (
+ "testing"
+ _ "unsafe"
+)
+
+//go:linkname heapObjectsCanMove runtime.heapObjectsCanMove
+func heapObjectsCanMove() bool
+
+func TestHeapObjectsCanMove(t *testing.T) {
+ if heapObjectsCanMove() {
+ // If this happens (or this test stops building),
+ // it will break go4.org/unsafe/assume-no-moving-gc.
+ t.Fatalf("heap objects can move!")
+ }
+}
sweepMinHeapDistance = 1024 * 1024
)
-// heapObjectsCanMove is always false in the current garbage collector.
+// heapObjectsCanMove always returns false in the current garbage collector.
// It exists for go4.org/unsafe/assume-no-moving-gc, which is an
// unfortunate idea that had an even more unfortunate implementation.
// Every time a new Go release happened, the package stopped building,
//
// If the Go garbage collector ever does move heap objects, we can set
// this to true to break all the programs using assume-no-moving-gc.
-var heapObjectsCanMove = false
+//
+//go:linkname heapObjectsCanMove
+func heapObjectsCanMove() bool {
+ return false
+}
func gcinit() {
if unsafe.Sizeof(workbuf{}) != _WorkbufSize {