blob: b0fcb02559081405eb9aad51e654390c4398dc5b [file] [log] [blame]
// 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.
// go:build ignore
package testdata
func instantiated[X any](x *X) int {
print(x)
return 0
}
type I interface {
Bar()
}
func interfaceInstantiated[X I](x X) {
x.Bar()
}
type A struct{}
func (a A) Bar() {}
type B struct{}
func (b B) Bar() {}
func Foo(a A, b B) {
x := true
instantiated[bool](&x)
y := 1
instantiated[int](&y)
interfaceInstantiated[A](a)
interfaceInstantiated[B](b)
}
// Relevant SSA:
//func Foo(a A, b B):
// t0 = local A (a)
// *t0 = a
// t1 = local B (b)
// *t1 = b
// t2 = new bool (x)
// *t2 = true:bool
// t3 = instantiated[[bool]](t2)
// t4 = new int (y)
// *t4 = 1:int
// t5 = instantiated[[int]](t4)
// t6 = *t0
// t7 = interfaceInstantiated[[testdata.A]](t6)
// t8 = *t1
// t9 = interfaceInstantiated[[testdata.B]](t8)
// return
//
//func interfaceInstantiated[[testdata.B]](x B):
// t0 = local B (x)
// *t0 = x
// t1 = *t0
// t2 = (B).Bar(t1)
// return
//
//func interfaceInstantiated[X I](x X):
// (external)
// WANT:
// Foo: instantiated[[bool]](t2) -> instantiated[[bool]]; instantiated[[int]](t4) -> instantiated[[int]]; interfaceInstantiated[[testdata.A]](t6) -> interfaceInstantiated[[testdata.A]]; interfaceInstantiated[[testdata.B]](t8) -> interfaceInstantiated[[testdata.B]]
// interfaceInstantiated[[testdata.B]]: (B).Bar(t1) -> B.Bar
// interfaceInstantiated[[testdata.A]]: (A).Bar(t1) -> A.Bar