github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/test/testdata/append_test.go (about)

     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.
     6  package main
     7  
     8  import "testing"
     9  
    10  //go:noinline
    11  func appendOne_ssa(a []int, x int) []int {
    12  	return append(a, x)
    13  }
    14  
    15  //go:noinline
    16  func appendThree_ssa(a []int, x, y, z int) []int {
    17  	return append(a, x, y, z)
    18  }
    19  
    20  func 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  
    32  func 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  
    39  func 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  
    59  func TestAppend(t *testing.T) {
    60  	testAppend(t)
    61  }