|  | // Copyright 2016 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. | 
|  |  | 
|  | package gc | 
|  |  | 
|  | // Test to make sure we make copies of the values we | 
|  | // put in interfaces. | 
|  |  | 
|  | import ( | 
|  | "testing" | 
|  | ) | 
|  |  | 
|  | var x int | 
|  |  | 
|  | func TestEfaceConv1(t *testing.T) { | 
|  | a := 5 | 
|  | i := interface{}(a) | 
|  | a += 2 | 
|  | if got := i.(int); got != 5 { | 
|  | t.Errorf("wanted 5, got %d\n", got) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestEfaceConv2(t *testing.T) { | 
|  | a := 5 | 
|  | sink = &a | 
|  | i := interface{}(a) | 
|  | a += 2 | 
|  | if got := i.(int); got != 5 { | 
|  | t.Errorf("wanted 5, got %d\n", got) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestEfaceConv3(t *testing.T) { | 
|  | x = 5 | 
|  | if got := e2int3(x); got != 5 { | 
|  | t.Errorf("wanted 5, got %d\n", got) | 
|  | } | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func e2int3(i interface{}) int { | 
|  | x = 7 | 
|  | return i.(int) | 
|  | } | 
|  |  | 
|  | func TestEfaceConv4(t *testing.T) { | 
|  | a := 5 | 
|  | if got := e2int4(a, &a); got != 5 { | 
|  | t.Errorf("wanted 5, got %d\n", got) | 
|  | } | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func e2int4(i interface{}, p *int) int { | 
|  | *p = 7 | 
|  | return i.(int) | 
|  | } | 
|  |  | 
|  | type Int int | 
|  |  | 
|  | var y Int | 
|  |  | 
|  | type I interface { | 
|  | foo() | 
|  | } | 
|  |  | 
|  | func (i Int) foo() { | 
|  | } | 
|  |  | 
|  | func TestIfaceConv1(t *testing.T) { | 
|  | a := Int(5) | 
|  | i := interface{}(a) | 
|  | a += 2 | 
|  | if got := i.(Int); got != 5 { | 
|  | t.Errorf("wanted 5, got %d\n", int(got)) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestIfaceConv2(t *testing.T) { | 
|  | a := Int(5) | 
|  | sink = &a | 
|  | i := interface{}(a) | 
|  | a += 2 | 
|  | if got := i.(Int); got != 5 { | 
|  | t.Errorf("wanted 5, got %d\n", int(got)) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestIfaceConv3(t *testing.T) { | 
|  | y = 5 | 
|  | if got := i2Int3(y); got != 5 { | 
|  | t.Errorf("wanted 5, got %d\n", int(got)) | 
|  | } | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func i2Int3(i I) Int { | 
|  | y = 7 | 
|  | return i.(Int) | 
|  | } | 
|  |  | 
|  | func TestIfaceConv4(t *testing.T) { | 
|  | a := Int(5) | 
|  | if got := i2Int4(a, &a); got != 5 { | 
|  | t.Errorf("wanted 5, got %d\n", int(got)) | 
|  | } | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func i2Int4(i I, p *Int) Int { | 
|  | *p = 7 | 
|  | return i.(Int) | 
|  | } | 
|  |  | 
|  | func BenchmarkEfaceInteger(b *testing.B) { | 
|  | sum := 0 | 
|  | for i := 0; i < b.N; i++ { | 
|  | sum += i2int(i) | 
|  | } | 
|  | sink = sum | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func i2int(i interface{}) int { | 
|  | return i.(int) | 
|  | } |