From dfdf55158dcfc3ef1bd436b3b9ed6daa20801fdb Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 6 Sep 2022 19:30:30 -0700 Subject: 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 TryBot-Result: Gopher Robot Reviewed-by: Cuong Manh Le Reviewed-by: Benny Siegert --- src/cmd/compile/internal/noder/writer.go | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/cmd/compile/internal/noder/writer.go') 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) -- cgit v1.3