mirror of
https://github.com/golang/go
synced 2024-11-19 08:04:40 -07:00
7e2e648a2d
Normalizing go/defer statements to always use functions with zero parameters and zero results was added to escape analysis, because that was the earliest point at which all three frontends converged. Now that we only have the unified frontend, we can do it during typecheck, which is where we perform all other desugaring and normalization rewrites. Change-Id: Iebf7679b117fd78b1dffee2974bbf85ebc923b23 Reviewed-on: https://go-review.googlesource.com/c/go/+/520260 Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> Auto-Submit: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
50 lines
2.3 KiB
Go
50 lines
2.3 KiB
Go
// errorcheck -0 -m -l
|
|
|
|
// Copyright 2019 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 p
|
|
|
|
func f(...*int) {}
|
|
|
|
func g() {
|
|
defer f()
|
|
defer f(new(int)) // ERROR "... argument does not escape$" "new\(int\) does not escape$"
|
|
defer f(new(int), new(int)) // ERROR "... argument does not escape$" "new\(int\) does not escape$"
|
|
|
|
defer f(nil...)
|
|
defer f([]*int{}...) // ERROR "\[\]\*int{} does not escape$"
|
|
defer f([]*int{new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) does not escape$"
|
|
defer f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) does not escape$"
|
|
|
|
go f()
|
|
go f(new(int)) // ERROR "... argument does not escape$" "new\(int\) escapes to heap$"
|
|
go f(new(int), new(int)) // ERROR "... argument does not escape$" "new\(int\) escapes to heap$"
|
|
|
|
go f(nil...)
|
|
go f([]*int{}...) // ERROR "\[\]\*int{} does not escape$"
|
|
go f([]*int{new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) escapes to heap$"
|
|
go f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) escapes to heap$"
|
|
|
|
for {
|
|
defer f()
|
|
defer f(new(int)) // ERROR "... argument does not escape$" "new\(int\) escapes to heap$"
|
|
defer f(new(int), new(int)) // ERROR "... argument does not escape$" "new\(int\) escapes to heap$"
|
|
|
|
defer f(nil...)
|
|
defer f([]*int{}...) // ERROR "\[\]\*int{} does not escape$"
|
|
defer f([]*int{new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) escapes to heap$"
|
|
defer f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) escapes to heap$"
|
|
|
|
go f()
|
|
go f(new(int)) // ERROR "... argument does not escape$" "new\(int\) escapes to heap$"
|
|
go f(new(int), new(int)) // ERROR "... argument does not escape$" "new\(int\) escapes to heap$"
|
|
|
|
go f(nil...)
|
|
go f([]*int{}...) // ERROR "\[\]\*int{} does not escape$"
|
|
go f([]*int{new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) escapes to heap$"
|
|
go f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) escapes to heap$"
|
|
}
|
|
}
|