mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
cmd/compile: fix re-export closure
For hidden closure built during stenciling to implement a function instantiation, the function may come from other package, not local package, which causes the ICE for code that re-export the hidden closure after inlining. To fix it, use the closure package for export writer when writing out the closure itself. Fixes #51423 Change-Id: I23b067ba14e2d602a0fc3b2e99bd9317afbe53ff Reviewed-on: https://go-review.googlesource.com/c/go/+/391574 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Keith Randall <khr@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
5003ed884a
commit
9743e9b6d8
@ -1835,7 +1835,10 @@ func (w *exportWriter) expr(n ir.Node) {
|
||||
n := n.(*ir.ClosureExpr)
|
||||
w.op(ir.OCLOSURE)
|
||||
w.pos(n.Pos())
|
||||
old := w.currPkg
|
||||
w.setPkg(n.Type().Pkg(), true)
|
||||
w.signature(n.Type())
|
||||
w.setPkg(old, true)
|
||||
|
||||
// Write out id for the Outer of each conditional variable. The
|
||||
// conditional variable itself for this closure will be re-created
|
||||
|
@ -1374,7 +1374,9 @@ func (r *importReader) node() ir.Node {
|
||||
case ir.OCLOSURE:
|
||||
//println("Importing CLOSURE")
|
||||
pos := r.pos()
|
||||
r.setPkg()
|
||||
typ := r.signature(nil, nil)
|
||||
r.setPkg()
|
||||
|
||||
// All the remaining code below is similar to (*noder).funcLit(), but
|
||||
// with Dcls and ClosureVars lists already set up
|
||||
|
17
test/typeparam/issue51423.dir/a.go
Normal file
17
test/typeparam/issue51423.dir/a.go
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright 2022 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package a
|
||||
|
||||
type Comparator[T any] func(v1, v2 T) int
|
||||
|
||||
func CompareInt[T ~int](a, b T) int {
|
||||
if a < b {
|
||||
return -1
|
||||
}
|
||||
if a == b {
|
||||
return 0
|
||||
}
|
||||
return 1
|
||||
}
|
11
test/typeparam/issue51423.dir/b.go
Normal file
11
test/typeparam/issue51423.dir/b.go
Normal file
@ -0,0 +1,11 @@
|
||||
package b
|
||||
|
||||
import "./a"
|
||||
|
||||
func C() a.Comparator[int] {
|
||||
return a.CompareInt[int]
|
||||
}
|
||||
|
||||
func main() {
|
||||
_ = C()(1, 2)
|
||||
}
|
7
test/typeparam/issue51423.go
Normal file
7
test/typeparam/issue51423.go
Normal file
@ -0,0 +1,7 @@
|
||||
// compiledir
|
||||
|
||||
// Copyright 2022 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ignored
|
Loading…
x
Reference in New Issue
Block a user