mirror of https://github.com/golang/go.git
go/ssa: tweak Function.Name() for generic instantiations
Was "f[[int]]", now "f[int]". Change-Id: I361d2386cffbabd0a4eca180b49c6da2b42cb28a Reviewed-on: https://go-review.googlesource.com/c/tools/+/407094 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Tim King <taking@google.com> gopls-CI: kokoro <noreply+kokoro@google.com> Run-TryBot: Alan Donovan <adonovan@google.com>
This commit is contained in:
parent
4dd2c74a9b
commit
904e24e9fc
|
|
@ -27,7 +27,7 @@ func f(h func(), g func(I), k func(A), a A, b B) {
|
|||
h()
|
||||
|
||||
k(a)
|
||||
g(b) // g:func(I) is not matched by instantiated[[B]]:func(B)
|
||||
g(b) // g:func(I) is not matched by instantiated[B]:func(B)
|
||||
|
||||
instantiated[A](a) // static call
|
||||
instantiated[B](b) // static call
|
||||
|
|
@ -38,8 +38,8 @@ func f(h func(), g func(I), k func(A), a A, b B) {
|
|||
// (*A).Foo --> (A).Foo
|
||||
// (*B).Foo --> (B).Foo
|
||||
// f --> Bar
|
||||
// f --> instantiated[[main.A]]
|
||||
// f --> instantiated[[main.A]]
|
||||
// f --> instantiated[[main.B]]
|
||||
// instantiated[[main.A]] --> (A).Foo
|
||||
// instantiated[[main.B]] --> (B).Foo
|
||||
// f --> instantiated[main.A]
|
||||
// f --> instantiated[main.A]
|
||||
// f --> instantiated[main.B]
|
||||
// instantiated[main.A] --> (A).Foo
|
||||
// instantiated[main.B] --> (B).Foo
|
||||
|
|
|
|||
|
|
@ -53,27 +53,27 @@ func lambda[X I]() func() func() {
|
|||
// All calls
|
||||
// (*C).Foo --> (C).Foo
|
||||
// (A).Foo$bound --> (A).Foo
|
||||
// instantiated[[main.A]] --> (A).Foo
|
||||
// instantiated[[main.B]] --> (B).Foo
|
||||
// instantiated[main.A] --> (A).Foo
|
||||
// instantiated[main.B] --> (B).Foo
|
||||
// main --> (*C).Foo
|
||||
// main --> (A).Foo$bound
|
||||
// main --> (C).Foo
|
||||
// main --> instantiated[[main.A]]
|
||||
// main --> instantiated[[main.B]]
|
||||
// main --> lambda[[main.A]]
|
||||
// main --> lambda[[main.A]]$1
|
||||
// main --> local[[main.C]]
|
||||
// main --> instantiated[main.A]
|
||||
// main --> instantiated[main.B]
|
||||
// main --> lambda[main.A]
|
||||
// main --> lambda[main.A]$1
|
||||
// main --> local[main.C]
|
||||
// Reachable functions
|
||||
// (*C).Foo
|
||||
// (A).Foo
|
||||
// (A).Foo$bound
|
||||
// (B).Foo
|
||||
// (C).Foo
|
||||
// instantiated[[main.A]]
|
||||
// instantiated[[main.B]]
|
||||
// lambda[[main.A]]
|
||||
// lambda[[main.A]]$1
|
||||
// local[[main.C]]
|
||||
// instantiated[main.A]
|
||||
// instantiated[main.B]
|
||||
// lambda[main.A]
|
||||
// lambda[main.A]$1
|
||||
// local[main.C]
|
||||
// Reflect types
|
||||
// *C
|
||||
// C
|
||||
|
|
|
|||
|
|
@ -93,10 +93,10 @@ func TestStatic(t *testing.T) {
|
|||
{genericsInput, []string{
|
||||
"(*A).F -> (A).F",
|
||||
"(*B).F -> (B).F",
|
||||
"f -> instantiated[[P.A]]",
|
||||
"f -> instantiated[[P.B]]",
|
||||
"instantiated[[P.A]] -> (A).F",
|
||||
"instantiated[[P.B]] -> (B).F",
|
||||
"f -> instantiated[P.A]",
|
||||
"f -> instantiated[P.B]",
|
||||
"instantiated[P.A] -> (A).F",
|
||||
"instantiated[P.B] -> (B).F",
|
||||
}, true},
|
||||
} {
|
||||
if e.typeparams && !typeparams.Enabled {
|
||||
|
|
|
|||
|
|
@ -45,17 +45,17 @@ func Foo(a A, b B) {
|
|||
// *t1 = b
|
||||
// t2 = new bool (x)
|
||||
// *t2 = true:bool
|
||||
// t3 = instantiated[[bool]](t2)
|
||||
// t3 = instantiated[bool](t2)
|
||||
// t4 = new int (y)
|
||||
// *t4 = 1:int
|
||||
// t5 = instantiated[[int]](t4)
|
||||
// t5 = instantiated[int](t4)
|
||||
// t6 = *t0
|
||||
// t7 = interfaceInstantiated[[testdata.A]](t6)
|
||||
// t7 = interfaceInstantiated[testdata.A](t6)
|
||||
// t8 = *t1
|
||||
// t9 = interfaceInstantiated[[testdata.B]](t8)
|
||||
// t9 = interfaceInstantiated[testdata.B](t8)
|
||||
// return
|
||||
//
|
||||
//func interfaceInstantiated[[testdata.B]](x B):
|
||||
//func interfaceInstantiated[testdata.B](x B):
|
||||
// t0 = local B (x)
|
||||
// *t0 = x
|
||||
// t1 = *t0
|
||||
|
|
@ -66,6 +66,6 @@ func Foo(a A, b B) {
|
|||
// (external)
|
||||
|
||||
// WANT:
|
||||
// Foo: instantiated[[bool]](t2) -> instantiated[[bool]]; instantiated[[int]](t4) -> instantiated[[int]]; interfaceInstantiated[[testdata.A]](t6) -> interfaceInstantiated[[testdata.A]]; interfaceInstantiated[[testdata.B]](t8) -> interfaceInstantiated[[testdata.B]]
|
||||
// interfaceInstantiated[[testdata.B]]: (B).Bar(t1) -> B.Bar
|
||||
// interfaceInstantiated[[testdata.A]]: (A).Bar(t1) -> A.Bar
|
||||
// Foo: instantiated[bool](t2) -> instantiated[bool]; instantiated[int](t4) -> instantiated[int]; interfaceInstantiated[testdata.A](t6) -> interfaceInstantiated[testdata.A]; interfaceInstantiated[testdata.B](t8) -> interfaceInstantiated[testdata.B]
|
||||
// interfaceInstantiated[testdata.B]: (B).Bar(t1) -> B.Bar
|
||||
// interfaceInstantiated[testdata.A]: (A).Bar(t1) -> A.Bar
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ func main() {
|
|||
fn(&b)
|
||||
}
|
||||
|
||||
// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[int]).String[[int]]
|
||||
// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[bool]).String[[bool]]
|
||||
// @calls command-line-arguments.Caller[[int]] -> (*command-line-arguments.S[int]).String[[int]]
|
||||
// @calls command-line-arguments.Caller[[bool]] -> (*command-line-arguments.S[bool]).String[[bool]]
|
||||
// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[int]).String[int]
|
||||
// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[bool]).String[bool]
|
||||
// @calls command-line-arguments.Caller[int] -> (*command-line-arguments.S[int]).String[int]
|
||||
// @calls command-line-arguments.Caller[bool] -> (*command-line-arguments.S[bool]).String[bool]
|
||||
|
|
|
|||
|
|
@ -627,19 +627,19 @@ var indirect = R[int].M
|
|||
"bound",
|
||||
"*func() int",
|
||||
"(p.S[int]).M$bound",
|
||||
"(p.S[int]).M[[int]]",
|
||||
"(p.S[int]).M[int]",
|
||||
},
|
||||
{
|
||||
"thunk",
|
||||
"*func(p.S[int]) int",
|
||||
"(p.S[int]).M$thunk",
|
||||
"(p.S[int]).M[[int]]",
|
||||
"(p.S[int]).M[int]",
|
||||
},
|
||||
{
|
||||
"indirect",
|
||||
"*func(p.R[int]) int",
|
||||
"(p.R[int]).M$thunk",
|
||||
"(p.S[int]).M[[int]]",
|
||||
"(p.S[int]).M[int]",
|
||||
},
|
||||
} {
|
||||
entry := entry
|
||||
|
|
@ -871,7 +871,7 @@ func TestGenericFunctionSelector(t *testing.T) {
|
|||
}
|
||||
sort.Strings(callees) // ignore the order in the code.
|
||||
|
||||
want := "[a.F[[int]] a.G[[int string]] a.H[[int]]]"
|
||||
want := "[a.F[int] a.G[int string] a.H[int]]"
|
||||
if got := fmt.Sprint(callees); got != want {
|
||||
t.Errorf("Expected main() to contain calls %v. got %v", want, got)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ func createInstance(fn *Function, targs []types.Type, info *types.Info, syntax a
|
|||
sig = prog.canon.Type(instance).(*types.Signature)
|
||||
}
|
||||
|
||||
name := fmt.Sprintf("%s[%s]", fn.Name(), targs) // may not be unique
|
||||
name := fmt.Sprintf("%s%s", fn.Name(), targs) // may not be unique
|
||||
synthetic := fmt.Sprintf("instantiation of %s", fn.Name())
|
||||
instance := &Function{
|
||||
name: name,
|
||||
|
|
|
|||
Loading…
Reference in New Issue