aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2023-05-03 14:53:03 -0700
committerGopher Robot <gobot@golang.org>2023-05-03 22:12:27 +0000
commit767fbe01aeb32d8fe72bb40fa0cc144a7263045b (patch)
treed60f971810600313e9cc5b3bfe4ee050b76b2b2d
parentaa6e16848041f07b004c7247cfe6b14bf64bcd22 (diff)
downloadgo-767fbe01aeb32d8fe72bb40fa0cc144a7263045b.tar.xz
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>
-rw-r--r--src/cmd/compile/internal/noder/writer.go15
-rw-r--r--test/fixedbugs/issue59338.go14
2 files changed, 19 insertions, 10 deletions
diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go
index 72c7a1fc86..178c3eb1a9 100644
--- a/src/cmd/compile/internal/noder/writer.go
+++ b/src/cmd/compile/internal/noder/writer.go
@@ -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
}
diff --git a/test/fixedbugs/issue59338.go b/test/fixedbugs/issue59338.go
index dc8604f319..8ba3fd2b3b 100644
--- a/test/fixedbugs/issue59338.go
+++ b/test/fixedbugs/issue59338.go
@@ -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 }