Inlining a call to a generic function.

a1: explicit type args, no shadowing
a2: the call uses type inference
a3: the type argument is shadowed in the callee
a4: ditto, with a more complicated arg
a5: a free identifier in the callee is captured by a global
    in the caller's scope (covered elsewhere; verifying for generics)
a7: return type of a generic function is generic interface requiring explicit conversion.
a8, a9: same as a7, but for parameters.
a10: inline declares a variable whose type is a type parameter
-- go.mod --
module testdata
go 1.18

-- a/a1.go --
package a

func _() {
	f[int](1) //@ inline(re"f", a1)
}

func f[T any](x T) { print(x) }
-- a1 --
...
func _() {
	print(int(1)) //@ inline(re"f", a1)
}

-- a/a1a.go --
package a

func _() {
	f[([]int)]([]int{1}) //@ inline(re"f", a1a)
}

func f[T any](x T) { print(x) }
-- a1a --
...
func _() {
	print(([]int)([]int{1})) //@ inline(re"f", a1a)
}

-- a/a2.go --
package a

func _() {
	f(1) //@ inline(re"f", re"cannot inline.*type.*inference")
}

-- a/a3.go --
package a

func _() {
	g[int]() //@ inline(re"g", re"cannot inline:.*shadow")
}

func g[T any]() {
	type int bool
	var x T
	print(x)
}

-- a/a4.go --
package a

func _() {
	g[map[int]string]()  //@ inline(re"g", re"cannot inline:.*shadow")
}

-- a/a5.go --
package a

import "testdata/b"

type bool int

func _() {
	b.H[int]() //@ inline(re"H", re"cannot inline.*shadowed")
}
-- b/b.go --
package b

func H[T comparable]() {
	var x map[T]bool
	print(x)
}

-- a/a6.go --
package a

type G[T any] struct{}

func (G[T]) f(x T) { print(x) }

func _() {
	G[int]{}.f[bool]() //@ inline(re"f", re"generic methods not yet supported")
}

-- a/a7.go --
package a

type Iface[T any] interface{ foo() }

func newIface[T any]() Iface[T] { return nil }

func _() {
	bar := newIface[int]() //@ inline(re"newIface", a7out)
	_ = bar
}

-- a7out --
package a

type Iface[T any] interface{ foo() }

func newIface[T any]() Iface[T] { return nil }

func _() {
	bar := Iface[int](nil) //@ inline(re"newIface", a7out)
	_ = bar
}

-- a/a8.go --
package a

func acceptsIface[T any](val Iface[T]) { print(val); append([]T, val) }

func _() {
	acceptsIface[int](Iface[int](nil)) //@ inline(re"acceptsIface", a8out)
}

-- a8out --
package a

func acceptsIface[T any](val Iface[T]) { print(val); append([]T, val) }

func _() {
	print(Iface[int](nil))
	append([]int, Iface[int](nil)) //@ inline(re"acceptsIface", a8out)
}

-- a/a9.go --
package a

type ifaceImpl struct{}

func (ifaceImpl) foo() {}

func _() {
	acceptsIface[int](ifaceImpl{}) //@ inline(re"acceptsIface", a9out)
}

-- a9out --
package a

type ifaceImpl struct{}

func (ifaceImpl) foo() {}

func _() {
	print(ifaceImpl{})
	append([]int, Iface[int](ifaceImpl{})) //@ inline(re"acceptsIface", a9out)
}
-- a/a10.go --
package a

func f2[T any](x, y T) { panic(x) }
func id(x int) int     { return x }

func _() {
	f2[int](id(1), id(2)) //@ inline(re"f2", a10out)
}
-- a10out --
package a

func f2[T any](x, y T) { panic(x) }
func id(x int) int     { return x }

func _() {
	var x, _ int = id(1), id(2)
	panic(x) //@ inline(re"f2", a10out)
}
