// Copyright 2015 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. // append_ssa.go tests append operations. package main import "testing" //go:noinline func appendOne_ssa(a []int, x int) []int { return append(a, x) } //go:noinline func appendThree_ssa(a []int, x, y, z int) []int { return append(a, x, y, z) } func eqBytes(a, b []int) bool { if len(a) != len(b) { return false } for i := range a { if a[i] != b[i] { return false } } return true } func expect(t *testing.T, got, want []int) { if eqBytes(got, want) { return } t.Errorf("expected %v, got %v\n", want, got) } func testAppend(t *testing.T) { var store [7]int a := store[:0] a = appendOne_ssa(a, 1) expect(t, a, []int{1}) a = appendThree_ssa(a, 2, 3, 4) expect(t, a, []int{1, 2, 3, 4}) a = appendThree_ssa(a, 5, 6, 7) expect(t, a, []int{1, 2, 3, 4, 5, 6, 7}) if &a[0] != &store[0] { t.Errorf("unnecessary grow") } a = appendOne_ssa(a, 8) expect(t, a, []int{1, 2, 3, 4, 5, 6, 7, 8}) if &a[0] == &store[0] { t.Errorf("didn't grow") } } func TestAppend(t *testing.T) { testAppend(t) }