blob: 061cc9a6e4e3ac767619825ef50ff8cfcf17033e [file] [log] [blame]
// Copyright 2025 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 test
import (
"internal/asan"
"internal/goexperiment"
"internal/msan"
"internal/race"
"testing"
)
func TestFreeAppendAllocations(t *testing.T) {
t.Run("slice-no-alias", func(t *testing.T) {
if !goexperiment.RuntimeFreegc {
t.Skip("skipping allocation test when runtime.freegc is disabled")
}
if race.Enabled || msan.Enabled || asan.Enabled {
// TODO(thepudds): we get 8 allocs for slice-no-alias instead of 1 with -race. This
// might be expected given some allocation optimizations are already disabled
// under race, but if not, we might need to update walk.
t.Skip("skipping allocation test under race detector and other sanitizers")
}
allocs := testing.AllocsPerRun(100, func() {
var s []int64
for i := range 100 {
s = append(s, int64(i))
}
_ = s
})
t.Logf("allocs: %v", allocs)
if allocs != 1 {
t.Errorf("allocs: %v, want 1", allocs)
}
})
t.Run("slice-aliased", func(t *testing.T) {
allocs := testing.AllocsPerRun(100, func() {
var s []int64
var alias []int64
for i := range 100 {
s = append(s, int64(i))
alias = s
}
_ = alias
})
t.Logf("allocs: %v", allocs)
if allocs < 2 {
t.Errorf("allocs: %v, want >= 2", allocs)
}
})
}