| // 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) | |
| } |