github.com/gagliardetto/golang-go@v0.0.0-20201020153340-53909ea70814/cmd/compile/internal/gc/iface_test.go (about)

     1  // Copyright 2016 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  package gc
     6  
     7  // Test to make sure we make copies of the values we
     8  // put in interfaces.
     9  
    10  import (
    11  	"testing"
    12  )
    13  
    14  var x int
    15  
    16  func TestEfaceConv1(t *testing.T) {
    17  	a := 5
    18  	i := interface{}(a)
    19  	a += 2
    20  	if got := i.(int); got != 5 {
    21  		t.Errorf("wanted 5, got %d\n", got)
    22  	}
    23  }
    24  
    25  func TestEfaceConv2(t *testing.T) {
    26  	a := 5
    27  	sink = &a
    28  	i := interface{}(a)
    29  	a += 2
    30  	if got := i.(int); got != 5 {
    31  		t.Errorf("wanted 5, got %d\n", got)
    32  	}
    33  }
    34  
    35  func TestEfaceConv3(t *testing.T) {
    36  	x = 5
    37  	if got := e2int3(x); got != 5 {
    38  		t.Errorf("wanted 5, got %d\n", got)
    39  	}
    40  }
    41  
    42  //go:noinline
    43  func e2int3(i interface{}) int {
    44  	x = 7
    45  	return i.(int)
    46  }
    47  
    48  func TestEfaceConv4(t *testing.T) {
    49  	a := 5
    50  	if got := e2int4(a, &a); got != 5 {
    51  		t.Errorf("wanted 5, got %d\n", got)
    52  	}
    53  }
    54  
    55  //go:noinline
    56  func e2int4(i interface{}, p *int) int {
    57  	*p = 7
    58  	return i.(int)
    59  }
    60  
    61  type Int int
    62  
    63  var y Int
    64  
    65  type I interface {
    66  	foo()
    67  }
    68  
    69  func (i Int) foo() {
    70  }
    71  
    72  func TestIfaceConv1(t *testing.T) {
    73  	a := Int(5)
    74  	i := interface{}(a)
    75  	a += 2
    76  	if got := i.(Int); got != 5 {
    77  		t.Errorf("wanted 5, got %d\n", int(got))
    78  	}
    79  }
    80  
    81  func TestIfaceConv2(t *testing.T) {
    82  	a := Int(5)
    83  	sink = &a
    84  	i := interface{}(a)
    85  	a += 2
    86  	if got := i.(Int); got != 5 {
    87  		t.Errorf("wanted 5, got %d\n", int(got))
    88  	}
    89  }
    90  
    91  func TestIfaceConv3(t *testing.T) {
    92  	y = 5
    93  	if got := i2Int3(y); got != 5 {
    94  		t.Errorf("wanted 5, got %d\n", int(got))
    95  	}
    96  }
    97  
    98  //go:noinline
    99  func i2Int3(i I) Int {
   100  	y = 7
   101  	return i.(Int)
   102  }
   103  
   104  func TestIfaceConv4(t *testing.T) {
   105  	a := Int(5)
   106  	if got := i2Int4(a, &a); got != 5 {
   107  		t.Errorf("wanted 5, got %d\n", int(got))
   108  	}
   109  }
   110  
   111  //go:noinline
   112  func i2Int4(i I, p *Int) Int {
   113  	*p = 7
   114  	return i.(Int)
   115  }
   116  
   117  func BenchmarkEfaceInteger(b *testing.B) {
   118  	sum := 0
   119  	for i := 0; i < b.N; i++ {
   120  		sum += i2int(i)
   121  	}
   122  	sink = sum
   123  }
   124  
   125  //go:noinline
   126  func i2int(i interface{}) int {
   127  	return i.(int)
   128  }