diff options
author | Cuong Manh Le <cuong.manhle.vn@gmail.com> | 2022-04-05 23:33:58 +0700 |
---|---|---|
committer | Heschi Kreinick <heschi@google.com> | 2022-05-09 20:13:36 +0000 |
commit | 1fb46d2a2026ca0adf5da77bba32f2a075fd6d86 (patch) | |
tree | 72035f506aad7080fb72e76e261eacfac5f9a0ce | |
parent | 9247bdddba13cad4ff69be1f9da25b14fe91371b (diff) | |
download | go-1fb46d2a2026ca0adf5da77bba32f2a075fd6d86.tar.gz go-1fb46d2a2026ca0adf5da77bba32f2a075fd6d86.zip |
[release-branch.go1.18] cmd/compile: set correct package for vars/params/results from nested instantiation
Fixes #52606
Change-Id: Ib5b2cdbdbce1d516aa10a0df349449b756f2f404
Reviewed-on: https://go-review.googlesource.com/c/go/+/398474
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Than McIntosh <thanm@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/403174
-rw-r--r-- | src/cmd/compile/internal/noder/stencil.go | 10 | ||||
-rw-r--r-- | test/typeparam/issue52117.dir/a.go | 15 | ||||
-rw-r--r-- | test/typeparam/issue52117.dir/b.go | 7 | ||||
-rw-r--r-- | test/typeparam/issue52117.go | 7 |
4 files changed, 39 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go index 39185ad7f4..58b7b9e8dd 100644 --- a/src/cmd/compile/internal/noder/stencil.go +++ b/src/cmd/compile/internal/noder/stencil.go @@ -417,6 +417,7 @@ func (g *genInst) buildClosure(outer *ir.Func, x ir.Node) ir.Node { var dictAssign *ir.AssignStmt if outer != nil { dictVar = ir.NewNameAt(pos, typecheck.LookupNum(typecheck.LocalDictName, g.dnum)) + dictVar.SetSym(outer.Sym().Pkg.Lookup(dictVar.Sym().Name)) g.dnum++ dictVar.Class = ir.PAUTO typed(types.Types[types.TUINTPTR], dictVar) @@ -431,6 +432,9 @@ func (g *genInst) buildClosure(outer *ir.Func, x ir.Node) ir.Node { var rcvrAssign ir.Node if rcvrValue != nil { rcvrVar = ir.NewNameAt(pos, typecheck.LookupNum(".rcvr", g.dnum)) + if outer != nil { + rcvrVar.SetSym(outer.Sym().Pkg.Lookup(rcvrVar.Sym().Name)) + } g.dnum++ typed(rcvrValue.Type(), rcvrVar) rcvrAssign = ir.NewAssignStmt(pos, rcvrVar, rcvrValue) @@ -2111,6 +2115,9 @@ func startClosure(pos src.XPos, outer *ir.Func, typ *types.Type) (*ir.Func, []*t for i := 0; i < typ.NumParams(); i++ { t := typ.Params().Field(i).Type arg := ir.NewNameAt(pos, typecheck.LookupNum("a", i)) + if outer != nil { + arg.SetSym(outer.Sym().Pkg.Lookup(arg.Sym().Name)) + } arg.Class = ir.PPARAM typed(t, arg) arg.Curfn = fn @@ -2123,6 +2130,9 @@ func startClosure(pos src.XPos, outer *ir.Func, typ *types.Type) (*ir.Func, []*t for i := 0; i < typ.NumResults(); i++ { t := typ.Results().Field(i).Type result := ir.NewNameAt(pos, typecheck.LookupNum("r", i)) // TODO: names not needed? + if outer != nil { + result.SetSym(outer.Sym().Pkg.Lookup(result.Sym().Name)) + } result.Class = ir.PPARAMOUT typed(t, result) result.Curfn = fn diff --git a/test/typeparam/issue52117.dir/a.go b/test/typeparam/issue52117.dir/a.go new file mode 100644 index 0000000000..e571ea9462 --- /dev/null +++ b/test/typeparam/issue52117.dir/a.go @@ -0,0 +1,15 @@ +// 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 + +func Compare[T int | uint](a, b T) int { + return 0 +} + +type Slice[T int | uint] struct{} + +func (l Slice[T]) Comparator() func(v1, v2 T) int { + return Compare[T] +} diff --git a/test/typeparam/issue52117.dir/b.go b/test/typeparam/issue52117.dir/b.go new file mode 100644 index 0000000000..3d3bf4ced9 --- /dev/null +++ b/test/typeparam/issue52117.dir/b.go @@ -0,0 +1,7 @@ +package b + +import "./a" + +func Test() { + var _ a.Slice[uint] +} diff --git a/test/typeparam/issue52117.go b/test/typeparam/issue52117.go new file mode 100644 index 0000000000..060a1214cc --- /dev/null +++ b/test/typeparam/issue52117.go @@ -0,0 +1,7 @@ +// compiledir -G=3 + +// 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 |