mirror of
https://github.com/golang/go
synced 2025-05-01 02:44:01 +00:00
[dev.typeparams] cmd/compile: simplify ~r/~b naming
The compiler renames anonymous and blank result parameters to ~rN or ~bN, but the current semantics for computing N are rather annoying and difficult to reproduce cleanly. They also lead to difficult to read escape analysis results in tests. This CL changes N to always be calculated as the parameter's index within the function's result parameter tuple. E.g., if a function has a single result, it will now always be named "~r0". The normative change to this CL is fairly simple, but it requires updating a lot of test expectations. Change-Id: I58a3c94de00cb822cb94efe52d115531193c993c Reviewed-on: https://go-review.googlesource.com/c/go/+/323010 Trust: Matthew Dempsky <mdempsky@google.com> Trust: Dan Scales <danscales@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
src/cmd/compile/internal
test
@ -12,15 +12,15 @@ var Ssink *string
|
||||
|
||||
type U [2]*string
|
||||
|
||||
func bar(a, b *string) U { // ERROR "leaking param: a to result ~r2 level=0$" "leaking param: b to result ~r2 level=0$"
|
||||
func bar(a, b *string) U { // ERROR "leaking param: a to result ~r0 level=0$" "leaking param: b to result ~r0 level=0$"
|
||||
return U{a, b}
|
||||
}
|
||||
|
||||
func foo(x U) U { // ERROR "leaking param: x to result ~r1 level=0$"
|
||||
func foo(x U) U { // ERROR "leaking param: x to result ~r0 level=0$"
|
||||
return U{x[1], x[0]}
|
||||
}
|
||||
|
||||
func bff(a, b *string) U { // ERROR "leaking param: a to result ~r2 level=0$" "leaking param: b to result ~r2 level=0$"
|
||||
func bff(a, b *string) U { // ERROR "leaking param: a to result ~r0 level=0$" "leaking param: b to result ~r0 level=0$"
|
||||
return foo(foo(bar(a, b)))
|
||||
}
|
||||
|
||||
@ -41,27 +41,27 @@ func tbff2() *string {
|
||||
return u[1]
|
||||
}
|
||||
|
||||
func car(x U) *string { // ERROR "leaking param: x to result ~r1 level=0$"
|
||||
func car(x U) *string { // ERROR "leaking param: x to result ~r0 level=0$"
|
||||
return x[0]
|
||||
}
|
||||
|
||||
// BAD: need fine-grained analysis to track x[0] and x[1] differently.
|
||||
func fun(x U, y *string) *string { // ERROR "leaking param: x to result ~r2 level=0$" "leaking param: y to result ~r2 level=0$"
|
||||
func fun(x U, y *string) *string { // ERROR "leaking param: x to result ~r0 level=0$" "leaking param: y to result ~r0 level=0$"
|
||||
x[0] = y
|
||||
return x[1]
|
||||
}
|
||||
|
||||
func fup(x *U, y *string) *string { // ERROR "leaking param: x to result ~r2 level=1$" "leaking param: y$"
|
||||
func fup(x *U, y *string) *string { // ERROR "leaking param: x to result ~r0 level=1$" "leaking param: y$"
|
||||
x[0] = y // leaking y to heap is intended
|
||||
return x[1]
|
||||
}
|
||||
|
||||
func fum(x *U, y **string) *string { // ERROR "leaking param: x to result ~r2 level=1$" "leaking param content: y$"
|
||||
func fum(x *U, y **string) *string { // ERROR "leaking param: x to result ~r0 level=1$" "leaking param content: y$"
|
||||
x[0] = *y
|
||||
return x[1]
|
||||
}
|
||||
|
||||
func fuo(x *U, y *U) *string { // ERROR "leaking param: x to result ~r2 level=1$" "leaking param content: y$"
|
||||
func fuo(x *U, y *U) *string { // ERROR "leaking param: x to result ~r0 level=1$" "leaking param content: y$"
|
||||
x[0] = y[0]
|
||||
return x[1]
|
||||
}
|
||||
|
Reference in New Issue
Block a user