diff options
| author | Cuong Manh Le <cuong.manhle.vn@gmail.com> | 2025-01-10 12:49:59 +0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-05-22 11:24:54 -0700 |
| commit | bfbf736564925fd91701a08395f903955cb4cbc7 (patch) | |
| tree | 7afa378c9bf397b22e4456b6ccd9e9e0f2b51754 /src/cmd/compile/internal/noder/reader.go | |
| parent | b1f259b1b42f055863a67492e7815ec752eae56b (diff) | |
| download | go-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/reader.go')
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 15 |
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? |
