blob: e18f16eba017a6ce688127628c588b565e83b199 [file] [log] [blame]
// Copyright 2023 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
// Test that the values of a named function type are correctly
// flowing from interface objects i in i.Foo() to the receiver
// parameters of callees of i.Foo().
type H func()
func (h H) Do() {
h()
}
type I interface {
Do()
}
func Bar() I {
return H(func() {})
}
func For(g G) {
b := Bar()
b.Do()
g[0] = b
g.Goo()
}
type G []I
func (g G) Goo() {
g[0].Do()
}
// Relevant SSA:
// func Bar$1():
// return
//
// func Bar() I:
// t0 = changetype H <- func() (Bar$1)
// t1 = make I <- H (t0)
//
// func For():
// t0 = Bar()
// t1 = invoke t0.Do()
// t2 = &g[0:int]
// *t2 = t0
// t3 = (G).Goo(g)
//
// func (h H) Do():
// t0 = h()
//
// func (g G) Goo():
// t0 = &g[0:int]
// t1 = *t0
// t2 = invoke t1.Do()
// WANT:
// For: (G).Goo(g) -> G.Goo; Bar() -> Bar; invoke t0.Do() -> H.Do
// H.Do: h() -> Bar$1
// G.Goo: invoke t1.Do() -> H.Do