From: Cuong Manh Le Date: Fri, 10 Jan 2025 05:49:59 +0000 (+0700) Subject: cmd/compile: do not shapify when reading reshaping expr X-Git-Tag: go1.25rc1~81 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=bfbf736564925fd91701a08395f903955cb4cbc7;p=gostls13.git 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 Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: Keith Randall Reviewed-by: David Chase --- 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? diff --git a/test/fixedbugs/issue71184.go b/test/fixedbugs/issue71184.go new file mode 100644 index 0000000000..74afc53f8a --- /dev/null +++ b/test/fixedbugs/issue71184.go @@ -0,0 +1,17 @@ +// compile + +// Copyright 2024 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 x + +func F[T int32]() { + _ = G[*[0]T]()[:] +} + +func G[T any]() (v T) { + return +} + +var _ = F[int32]