go/test/typeparam/geninline.dir/a.go
Dan Scales a80e53ec43 cmd/compile: support new fully-inst types referenced during inlining
Modify the phase for creating needed function/method instantiations and
modifying functions to use those instantiations, so that the phase is
self-contained and can be called again after inlining. This is to deal
with the issue that inlining may reveal new fully-instantiated types
whose methods must be instantiated.

With this change, we have an extra phase for instantiation after
inlining, to take care of the new fully-instantiated types that have
shown up during inlining. We call inline.InlineCalls() for any new
instantiated functions that are created.

Change-Id: I4ddf0b1907e5f1f7d45891db7876455a99381133
Reviewed-on: https://go-review.googlesource.com/c/go/+/352870
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Trust: Alexander Rakoczy <alex@golang.org>
2021-10-15 16:57:36 +00:00

57 lines
799 B
Go

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