diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2023-05-03 14:53:03 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-05-03 22:12:27 +0000 |
| commit | 767fbe01aeb32d8fe72bb40fa0cc144a7263045b (patch) | |
| tree | d60f971810600313e9cc5b3bfe4ee050b76b2b2d /src/cmd/compile/internal/noder | |
| parent | aa6e16848041f07b004c7247cfe6b14bf64bcd22 (diff) | |
| download | go-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>
Diffstat (limited to 'src/cmd/compile/internal/noder')
| -rw-r--r-- | src/cmd/compile/internal/noder/writer.go | 15 |
1 files changed, 13 insertions, 2 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 } |
