diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2022-09-06 19:30:30 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2022-09-07 17:26:39 +0000 |
| commit | dfdf55158dcfc3ef1bd436b3b9ed6daa20801fdb (patch) | |
| tree | f98fc595f2f74f8bec0bfa049f1bf98bad90ec08 /src | |
| parent | 10ffb27528af47c28ee55683421056e3de5bee17 (diff) | |
| download | go-dfdf55158dcfc3ef1bd436b3b9ed6daa20801fdb.tar.xz | |
cmd/compile/internal/noder: fix type switch case vars package
When naming case variables, the unified frontend was using
typecheck.Lookup, which uses the current package, rather than
localIdent, which uses the package the variable was originally
declared in. When inlining across package boundaries, this could cause
the case variables to be associated with the wrong package.
In practice, I don't believe this has any negative consequences, but
it's inconsistent and triggered an ICE in typecheck.ClosureType, which
expected all captured variables to be declared in the same package.
Easy fix is to ensure case variables are declared in the correct
package by using localIdent.
Fixes #54912.
Change-Id: I7a429c708ad95723f46a67872cb0cf0c53a6a0d6
Reviewed-on: https://go-review.googlesource.com/c/go/+/428918
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 2 | ||||
| -rw-r--r-- | src/cmd/compile/internal/noder/writer.go | 4 | ||||
| -rw-r--r-- | src/cmd/compile/internal/typecheck/func.go | 2 |
3 files changed, 6 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index fb9df3284f..b8df7c9773 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go @@ -1957,7 +1957,7 @@ func (r *reader) switchStmt(label *types.Sym) ir.Node { pos := r.pos() if r.Bool() { pos := r.pos() - sym := typecheck.Lookup(r.String()) + _, sym := r.localIdent() ident = ir.NewIdent(pos, sym) } x := r.expr() diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go index 0b1d41d750..198bae7190 100644 --- a/src/cmd/compile/internal/noder/writer.go +++ b/src/cmd/compile/internal/noder/writer.go @@ -1484,6 +1484,10 @@ func (w *writer) switchStmt(stmt *syntax.SwitchStmt) { w.pos(guard) if tag := guard.Lhs; w.Bool(tag != nil) { w.pos(tag) + + // Like w.localIdent, but we don't have a types2.Object. + w.Sync(pkgbits.SyncLocalIdent) + w.pkg(w.p.curpkg) w.String(tag.Value) } w.expr(guard.X) diff --git a/src/cmd/compile/internal/typecheck/func.go b/src/cmd/compile/internal/typecheck/func.go index d62066f33c..7cf9d5cb40 100644 --- a/src/cmd/compile/internal/typecheck/func.go +++ b/src/cmd/compile/internal/typecheck/func.go @@ -105,7 +105,7 @@ func ClosureType(clo *ir.ClosureExpr) *types.Type { if pkg == nil { pkg = v.Sym().Pkg } else if pkg != v.Sym().Pkg { - base.Fatalf("Closure variables from multiple packages") + base.Fatalf("Closure variables from multiple packages: %+v", clo) } } } |
