| // run |
| |
| // 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)) |
| } |
| } |