blob: f71fd526a7a1f96fe26e9dd3493adc5985540aa7 [file]
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)
}