• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// append_ssa.go tests append operations.
6package main
7
8import "testing"
9
10//go:noinline
11func appendOne_ssa(a []int, x int) []int {
12	return append(a, x)
13}
14
15//go:noinline
16func appendThree_ssa(a []int, x, y, z int) []int {
17	return append(a, x, y, z)
18}
19
20func eqBytes(a, b []int) bool {
21	if len(a) != len(b) {
22		return false
23	}
24	for i := range a {
25		if a[i] != b[i] {
26			return false
27		}
28	}
29	return true
30}
31
32func expect(t *testing.T, got, want []int) {
33	if eqBytes(got, want) {
34		return
35	}
36	t.Errorf("expected %v, got %v\n", want, got)
37}
38
39func testAppend(t *testing.T) {
40	var store [7]int
41	a := store[:0]
42
43	a = appendOne_ssa(a, 1)
44	expect(t, a, []int{1})
45	a = appendThree_ssa(a, 2, 3, 4)
46	expect(t, a, []int{1, 2, 3, 4})
47	a = appendThree_ssa(a, 5, 6, 7)
48	expect(t, a, []int{1, 2, 3, 4, 5, 6, 7})
49	if &a[0] != &store[0] {
50		t.Errorf("unnecessary grow")
51	}
52	a = appendOne_ssa(a, 8)
53	expect(t, a, []int{1, 2, 3, 4, 5, 6, 7, 8})
54	if &a[0] == &store[0] {
55		t.Errorf("didn't grow")
56	}
57}
58
59func TestAppend(t *testing.T) {
60	testAppend(t)
61}
62