// 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 "fmt" var failed = false //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 eq(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(got, want []int) { if eq(got, want) { return } fmt.Printf("expected %v, got %v\n", want, got) failed = true } func testAppend() { var store [7]int a := store[:0] a = appendOne_ssa(a, 1) expect(a, []int{1}) a = appendThree_ssa(a, 2, 3, 4) expect(a, []int{1, 2, 3, 4}) a = appendThree_ssa(a, 5, 6, 7) expect(a, []int{1, 2, 3, 4, 5, 6, 7}) if &a[0] != &store[0] { fmt.Println("unnecessary grow") failed = true } a = appendOne_ssa(a, 8) expect(a, []int{1, 2, 3, 4, 5, 6, 7, 8}) if &a[0] == &store[0] { fmt.Println("didn't grow") failed = true } } func main() { testAppend() if failed { panic("failed") } }