-- go.mod --
module example.com
go 1.18

-- iface.go --
package main

import (
	"example.com/subpkg"
)

func use(interface{})

// Test of interface calls.

func main() {
	use(subpkg.A(0))
	use(new(subpkg.B))
	use(subpkg.B2(0))

	var i interface {
		F()
	}

	// assign an interface type with a function return interface value
	i = subpkg.NewInterfaceF()

	i.F()
}

func dead() {
	use(subpkg.D(0))
}

// WANT:
//
// edge (*example.com/subpkg.A).F --static method call--> (example.com/subpkg.A).F
// edge (*example.com/subpkg.B2).F --static method call--> (example.com/subpkg.B2).F
// edge (*example.com/subpkg.C).F --static method call--> (example.com/subpkg.C).F
// edge init --static function call--> example.com/subpkg.init
// edge main --dynamic method call--> (*example.com/subpkg.A).F
// edge main --dynamic method call--> (*example.com/subpkg.B).F
// edge main --dynamic method call--> (*example.com/subpkg.B2).F
// edge main --dynamic method call--> (*example.com/subpkg.C).F
// edge main --dynamic method call--> (example.com/subpkg.A).F
// edge main --dynamic method call--> (example.com/subpkg.B2).F
// edge main --dynamic method call--> (example.com/subpkg.C).F
// edge main --static function call--> example.com/subpkg.NewInterfaceF
// edge main --static function call--> use
//
// reachable (*example.com/subpkg.A).F
// reachable (*example.com/subpkg.B).F
// reachable (*example.com/subpkg.B2).F
// reachable (*example.com/subpkg.C).F
// reachable (example.com/subpkg.A).F
// !reachable (example.com/subpkg.B).F
// reachable (example.com/subpkg.B2).F
// reachable (example.com/subpkg.C).F
// reachable example.com/subpkg.NewInterfaceF
// reachable example.com/subpkg.init
// !reachable (*example.com/subpkg.D).F
// !reachable (example.com/subpkg.D).F
// reachable init
// reachable main
// reachable use
//
// rtype *example.com/subpkg.A
// rtype *example.com/subpkg.B
// rtype *example.com/subpkg.B2
// rtype *example.com/subpkg.C
// rtype example.com/subpkg.B
// rtype example.com/subpkg.A
// rtype example.com/subpkg.B2
// rtype example.com/subpkg.C
// !rtype example.com/subpkg.D

-- subpkg/impl.go --
package subpkg

type InterfaceF interface {
	F()
}

type A byte // instantiated but not a reflect type

func (A) F() {} // reachable: exported method of reflect type

type B int // a reflect type

func (*B) F() {} // reachable: exported method of reflect type

type B2 int // a reflect type, and *B2 also

func (B2) F() {} // reachable: exported method of reflect type

type C string

func (C) F() {} // reachable: exported by NewInterfaceF

func NewInterfaceF() InterfaceF {
	return C("")
}

type D uint // instantiated only in dead code

func (*D) F() {} // unreachable