aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2025-01-10 12:49:59 +0700
committerGopher Robot <gobot@golang.org>2025-05-22 11:24:54 -0700
commitbfbf736564925fd91701a08395f903955cb4cbc7 (patch)
tree7afa378c9bf397b22e4456b6ccd9e9e0f2b51754 /src/cmd/compile/internal/noder
parentb1f259b1b42f055863a67492e7815ec752eae56b (diff)
downloadgo-bfbf736564925fd91701a08395f903955cb4cbc7.tar.xz
cmd/compile: do not shapify when reading reshaping expr
Fixes #71184 Change-Id: I22e7ae5203311e86a90502bfe155b0597007887d Reviewed-on: https://go-review.googlesource.com/c/go/+/641955 Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Keith Randall <khr@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder')
-rw-r--r--src/cmd/compile/internal/noder/reader.go15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go
index 95054a4f8b..c854619897 100644
--- a/src/cmd/compile/internal/noder/reader.go
+++ b/src/cmd/compile/internal/noder/reader.go
@@ -49,6 +49,9 @@ type pkgReader struct {
// but bitwise inverted so we can detect if we're missing the entry
// or not.
newindex []index
+
+ // indicates whether the data is reading during reshaping.
+ reshaping bool
}
func newPkgReader(pr pkgbits.PkgDecoder) *pkgReader {
@@ -116,6 +119,10 @@ type reader struct {
// find parameters/results.
funarghack bool
+ // reshaping is used during reading exprReshape code, preventing
+ // the reader from shapifying the re-shaped type.
+ reshaping bool
+
// methodSym is the name of method's name, if reading a method.
// It's nil if reading a normal function or closure body.
methodSym *types.Sym
@@ -1007,7 +1014,7 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx index, implicits, explicits
// arguments.
for i, targ := range dict.targs {
basic := r.Bool()
- if dict.shaped {
+ if dict.shaped && !pr.reshaping {
dict.targs[i] = shapify(targ, basic)
}
}
@@ -2445,7 +2452,10 @@ func (r *reader) expr() (res ir.Node) {
case exprReshape:
typ := r.typ()
+ old := r.reshaping
+ r.reshaping = true
x := r.expr()
+ r.reshaping = old
if types.IdenticalStrict(x.Type(), typ) {
return x
@@ -2568,7 +2578,10 @@ func (r *reader) funcInst(pos src.XPos) (wrapperFn, baseFn, dictPtr ir.Node) {
info := r.dict.subdicts[idx]
explicits := r.p.typListIdx(info.explicits, r.dict)
+ old := r.p.reshaping
+ r.p.reshaping = r.reshaping
baseFn = r.p.objIdx(info.idx, implicits, explicits, true).(*ir.Name)
+ r.p.reshaping = old
// TODO(mdempsky): Is there a more robust way to get the
// dictionary pointer type here?