| 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) |
| -- 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") |
| } |