mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
cmd/compile: fix compilation of inferred type arguments
Previously, type arguments could only be inferred for generic functions in call expressions, whereas with the reverse type inference proposal they can now be inferred in assignment contexts too. As a consequence, we now need to check Info.Instances to find the inferred type for more cases now. Updates #59338. Fixes #59955. Change-Id: I9b6465395869459c2387d0424febe7337b28b90e Reviewed-on: https://go-review.googlesource.com/c/go/+/492455 Auto-Submit: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
aa6e168480
commit
767fbe01ae
@ -123,14 +123,25 @@ func (pw *pkgWriter) unexpected(what string, p poser) {
|
||||
}
|
||||
|
||||
func (pw *pkgWriter) typeAndValue(x syntax.Expr) syntax.TypeAndValue {
|
||||
tv := x.GetTypeInfo()
|
||||
if tv.Type == nil {
|
||||
tv, ok := pw.maybeTypeAndValue(x)
|
||||
if !ok {
|
||||
pw.fatalf(x, "missing Types entry: %v", syntax.String(x))
|
||||
}
|
||||
return tv
|
||||
}
|
||||
|
||||
func (pw *pkgWriter) maybeTypeAndValue(x syntax.Expr) (syntax.TypeAndValue, bool) {
|
||||
tv := x.GetTypeInfo()
|
||||
|
||||
// If x is a generic function whose type arguments are inferred
|
||||
// from assignment context, then we need to find its inferred type
|
||||
// in Info.Instances instead.
|
||||
if name, ok := x.(*syntax.Name); ok {
|
||||
if inst, ok := pw.info.Instances[name]; ok {
|
||||
tv.Type = inst.Type
|
||||
}
|
||||
}
|
||||
|
||||
return tv, tv.Type != nil
|
||||
}
|
||||
|
||||
|
@ -21,15 +21,13 @@ func main() {
|
||||
panic(2)
|
||||
}
|
||||
|
||||
// Disabled for now - requires some noder work
|
||||
// TODO fix this
|
||||
// if g3(g1, 3) != g1(3) {
|
||||
// panic(3)
|
||||
// }
|
||||
if g3(g1, 3) != g1(3) {
|
||||
panic(3)
|
||||
}
|
||||
|
||||
// if g4(g2, 4) != "" {
|
||||
// panic(4)
|
||||
// }
|
||||
if g4(g2, 4) != "" {
|
||||
panic(4)
|
||||
}
|
||||
}
|
||||
|
||||
func g1[P any](x P) P { return x }
|
||||
|
Loading…
x
Reference in New Issue
Block a user