mirror of
https://github.com/golang/go
synced 2024-11-22 23:50:03 -07:00
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>
This commit is contained in:
parent
10ffb27528
commit
dfdf55158d
@ -1957,7 +1957,7 @@ func (r *reader) switchStmt(label *types.Sym) ir.Node {
|
|||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
if r.Bool() {
|
if r.Bool() {
|
||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
sym := typecheck.Lookup(r.String())
|
_, sym := r.localIdent()
|
||||||
ident = ir.NewIdent(pos, sym)
|
ident = ir.NewIdent(pos, sym)
|
||||||
}
|
}
|
||||||
x := r.expr()
|
x := r.expr()
|
||||||
|
@ -1484,6 +1484,10 @@ func (w *writer) switchStmt(stmt *syntax.SwitchStmt) {
|
|||||||
w.pos(guard)
|
w.pos(guard)
|
||||||
if tag := guard.Lhs; w.Bool(tag != nil) {
|
if tag := guard.Lhs; w.Bool(tag != nil) {
|
||||||
w.pos(tag)
|
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.String(tag.Value)
|
||||||
}
|
}
|
||||||
w.expr(guard.X)
|
w.expr(guard.X)
|
||||||
|
@ -105,7 +105,7 @@ func ClosureType(clo *ir.ClosureExpr) *types.Type {
|
|||||||
if pkg == nil {
|
if pkg == nil {
|
||||||
pkg = v.Sym().Pkg
|
pkg = v.Sym().Pkg
|
||||||
} else if 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2021,8 +2021,6 @@ var unifiedFailures = setOf(
|
|||||||
"closure3.go", // unified IR numbers closures differently than -d=inlfuncswithclosures
|
"closure3.go", // unified IR numbers closures differently than -d=inlfuncswithclosures
|
||||||
"escape4.go", // unified IR can inline f5 and f6; test doesn't expect this
|
"escape4.go", // unified IR can inline f5 and f6; test doesn't expect this
|
||||||
|
|
||||||
"fixedbugs/issue54912.go", // ICE when inlined type switch case variable captured in function literal
|
|
||||||
|
|
||||||
"typeparam/issue47631.go", // unified IR can handle local type declarations
|
"typeparam/issue47631.go", // unified IR can handle local type declarations
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user