diff options
| author | Dan Scales <danscales@google.com> | 2021-09-28 21:14:17 -0700 |
|---|---|---|
| committer | Dan Scales <danscales@google.com> | 2021-09-29 16:09:04 +0000 |
| commit | c2de759581aef5d14fd07b843caf76db3c8a115b (patch) | |
| tree | 3ef78f3bff904fdcaffa8a72c256083b527f0bd5 /src/cmd/compile/internal/noder | |
| parent | aeb4fbabc0aaa5293dd34821c450855e9ff82230 (diff) | |
| download | go-c2de759581aef5d14fd07b843caf76db3c8a115b.tar.xz | |
cmd/compile: make sure shapes have proper indexes for sub-instantiation
The computation for determining the shapes to use at the top of
getInstantation was not always creating shapes with the proper indexes.
If an instantiation is being called from another instantiated function,
we cannot just copy the shape types unchanged, because their indexes may
have changed. So, for type args that already shapes, we still call
Shapify() with the correct index.
Fixes #48645
Change-Id: Ibb61c6f9a3c317220fb85135ca87eb5ad4dcff9e
Reviewed-on: https://go-review.googlesource.com/c/go/+/353030
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/noder')
| -rw-r--r-- | src/cmd/compile/internal/noder/stencil.go | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go index e49702c04c..2bc1756b8d 100644 --- a/src/cmd/compile/internal/noder/stencil.go +++ b/src/cmd/compile/internal/noder/stencil.go @@ -610,21 +610,16 @@ func (g *irgen) getInstantiation(nameNode *ir.Name, shapes []*types.Type, isMeth // number of instantiations we have to generate. You can actually have a mix // of shape and non-shape arguments, because of inferred or explicitly // specified concrete type args. - var s1 []*types.Type + s1 := make([]*types.Type, len(shapes)) for i, t := range shapes { if !t.IsShape() { - if s1 == nil { - s1 = make([]*types.Type, len(shapes)) - copy(s1[0:i], shapes[0:i]) - } s1[i] = typecheck.Shapify(t, i) - } else if s1 != nil { - s1[i] = shapes[i] + } else { + // Already a shape, but make sure it has the correct index. + s1[i] = typecheck.Shapify(shapes[i].Underlying(), i) } } - if s1 != nil { - shapes = s1 - } + shapes = s1 sym := typecheck.MakeFuncInstSym(nameNode.Sym(), shapes, false, isMeth) info := g.instInfoMap[sym] |
