| // 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. | |
| package a | |
| type IVal[T comparable] interface { | |
| check(want T) | |
| } | |
| type Val[T comparable] struct { | |
| val T | |
| } | |
| //go:noinline | |
| func (l *Val[T]) check(want T) { | |
| if l.val != want { | |
| panic("hi") | |
| } | |
| } | |
| func Test1() { | |
| var l Val[int] | |
| if l.val != 0 { | |
| panic("hi") | |
| } | |
| _ = IVal[int](&l) | |
| } | |
| func Test2() { | |
| var l Val[float64] | |
| l.val = 3.0 | |
| l.check(float64(3)) | |
| _ = IVal[float64](&l) | |
| } | |
| type privateVal[T comparable] struct { | |
| val T | |
| } | |
| //go:noinline | |
| func (l *privateVal[T]) check(want T) { | |
| if l.val != want { | |
| panic("hi") | |
| } | |
| } | |
| type Outer struct { | |
| val privateVal[string] | |
| } | |
| func Test3() { | |
| var o Outer | |
| o.val.check("") | |
| _ = IVal[string](&o.val) | |
| } | |