mirror of
https://github.com/golang/go
synced 2024-10-02 22:25:08 +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)
|
n := n.(*ir.ClosureExpr)
|
||||||
w.op(ir.OCLOSURE)
|
w.op(ir.OCLOSURE)
|
||||||
w.pos(n.Pos())
|
w.pos(n.Pos())
|
||||||
|
old := w.currPkg
|
||||||
|
w.setPkg(n.Type().Pkg(), true)
|
||||||
w.signature(n.Type())
|
w.signature(n.Type())
|
||||||
|
w.setPkg(old, true)
|
||||||
|
|
||||||
// Write out id for the Outer of each conditional variable. The
|
// Write out id for the Outer of each conditional variable. The
|
||||||
// conditional variable itself for this closure will be re-created
|
// conditional variable itself for this closure will be re-created
|
||||||
|
|
|
@ -1374,7 +1374,9 @@ func (r *importReader) node() ir.Node {
|
||||||
case ir.OCLOSURE:
|
case ir.OCLOSURE:
|
||||||
//println("Importing CLOSURE")
|
//println("Importing CLOSURE")
|
||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
|
r.setPkg()
|
||||||
typ := r.signature(nil, nil)
|
typ := r.signature(nil, nil)
|
||||||
|
r.setPkg()
|
||||||
|
|
||||||
// All the remaining code below is similar to (*noder).funcLit(), but
|
// All the remaining code below is similar to (*noder).funcLit(), but
|
||||||
// with Dcls and ClosureVars lists already set up
|
// 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…
Reference in a new issue