go/test/typeparam/genembed.go
Dan Scales ac6d706a05 [dev.typeparams] cmd/compile: add test for number of instantiations
Add a test for a generic sort function, operating on several different
pointer types (across two packages), so they should all share the same
shape-based instantiation. Actually check that only one instantiation of
Sort is created using 'go tool nm', and also check that the output is
correct.

In order to do the test on the executable using 'go nm', added this as a
'go test' in cmd/compile/internal/test.

Added the genembed.go test that I meant to include with a previous CL.

Change-Id: I9962913c2f1809484c2b1dfef3b07e4c8770731c
Reviewed-on: https://go-review.googlesource.com/c/go/+/354696
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2021-10-12 20:53:52 +00:00

53 lines
915 B
Go

// run -gcflags=-G=3
// Copyright 2021 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.
// Test wrappers/interfaces for generic type embedding another generic type.
package main
import "fmt"
type A[T any] struct {
B[T]
}
type B[T any] struct {
val T
}
func (b *B[T]) get() T {
return b.val
}
type getter[T any] interface {
get() T
}
//go:noinline
func doGet[T any](i getter[T]) T {
return i.get()
}
//go:noline
func doGet2[T any](i interface{}) T {
i2 := i.(getter[T])
return i2.get()
}
func main() {
a := A[int]{B: B[int]{3}}
var i getter[int] = &a
if got, want := doGet(i), 3; got != want {
panic(fmt.Sprintf("got %v, want %v", got, want))
}
as := A[string]{B: B[string]{"abc"}}
if got, want := doGet2[string](&as), "abc"; got != want {
panic(fmt.Sprintf("got %v, want %v", got, want))
}
}