go/src/cmd/compile/internal/test/iface_test.go
Russ Cox 37f138df6b [dev.regabi] cmd/compile: split out package test [generated]
[git-generate]
cd src/cmd/compile/internal/gc
rf '
	mv bench_test.go constFold_test.go dep_test.go \
		fixedbugs_test.go iface_test.go float_test.go global_test.go \
		inl_test.go lang_test.go logic_test.go \
		reproduciblebuilds_test.go shift_test.go ssa_test.go \
		truncconst_test.go zerorange_test.go \
		cmd/compile/internal/test
'
mv testdata ../test

Change-Id: I041971b7e9766673f7a331679bfe1c8110dcda66
Reviewed-on: https://go-review.googlesource.com/c/go/+/279480
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2020-12-23 06:40:04 +00:00

126 lines
1.9 KiB
Go

// 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 test
import "testing"
// Test to make sure we make copies of the values we
// put in interfaces.
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)
}