targs[i] = ir.TypeNode(g.typ(inferred.TArgs.At(i)))
}
if fun.Op() == ir.OFUNCINST {
- // Replace explicit type args with the full list that
- // includes the additional inferred type args.
- // Substitute the type args for the type params in
- // the generic function's type.
- fun.(*ir.InstExpr).Targs = targs
- newt := g.substType(fun.Type(), fun.Type().TParams(), targs)
- typed(newt, fun)
+ if len(fun.(*ir.InstExpr).Targs) < len(targs) {
+ // Replace explicit type args with the full list that
+ // includes the additional inferred type args.
+ // Substitute the type args for the type params in
+ // the generic function's type.
+ fun.(*ir.InstExpr).Targs = targs
+ newt := g.substType(fun.(*ir.InstExpr).X.Type(), fun.(*ir.InstExpr).X.Type().TParams(), targs)
+ typed(newt, fun)
+ }
} else {
// Create a function instantiation here, given there
// are only inferred type args (e.g. min(5,6), where
--- /dev/null
+// run -gcflags=-G=3
+
+// Copyright 2021 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.
+
+package main
+
+type Src[T any] func() Src[T]
+
+func Seq[T any]() Src[T] {
+ return nil
+}
+
+func Seq2[T1 any, T2 any](v1 T1, v2 T2) Src[T2] {
+ return nil
+}
+
+func main() {
+ // Type args fully supplied
+ Seq[int]()
+ // Partial inference of type args
+ Seq2[int](5, "abc")
+ // Full inference of type args
+ Seq2(5, "abc")
+}