mirror of
https://github.com/golang/go
synced 2024-11-17 17:44:46 -07:00
ac6d706a05
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>
53 lines
915 B
Go
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))
|
|
}
|
|
}
|