mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
![David Chase](/assets/img/avatar_default.png)
This line of the inlining tuning experiment https://go-review.googlesource.com/c/go/+/109918/1/src/cmd/compile/internal/gc/inl.go#347 was incorrectly rewritten in a later patch to use the call cost, not the panic cost, and thus the inlining of panic didn't occur when it should. I discovered this when I realized that tests should have failed, but didn't. Fix is to make the correct change, and also to modify the tests that this causes to fail. One test now asserts the new normal, the other calls "ppanic" instead which is designed to behave like panic but not be inlined. Change-Id: I423bb7f08bd66a70d999826dd9b87027abf34cdf Reviewed-on: https://go-review.googlesource.com/116656 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
// errorcheck -0 -m
|
|
|
|
// Copyright 2010 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.
|
|
|
|
// Test, using compiler diagnostic flags, that the escape analysis is working.
|
|
// Compiles but does not run. Inlining is enabled.
|
|
|
|
package foo
|
|
|
|
var p *int
|
|
|
|
func alloc(x int) *int { // ERROR "can inline alloc" "moved to heap: x"
|
|
return &x // ERROR "&x escapes to heap"
|
|
}
|
|
|
|
var f func()
|
|
|
|
func f1() {
|
|
p = alloc(2) // ERROR "inlining call to alloc" "&x escapes to heap" "moved to heap: x"
|
|
|
|
// Escape analysis used to miss inlined code in closures.
|
|
|
|
func() { // ERROR "can inline f1.func1"
|
|
p = alloc(3) // ERROR "inlining call to alloc"
|
|
}() // ERROR "inlining call to f1.func1" "inlining call to alloc" "&x escapes to heap" "moved to heap: x"
|
|
|
|
f = func() { // ERROR "func literal escapes to heap" "can inline f1.func2"
|
|
p = alloc(3) // ERROR "inlining call to alloc" "&x escapes to heap" "moved to heap: x"
|
|
}
|
|
f()
|
|
}
|
|
|
|
func f2() {} // ERROR "can inline f2"
|
|
|
|
// No inline for recover; panic now allowed to inline.
|
|
func f3() { panic(1) } // ERROR "can inline f3"
|
|
func f4() { recover() }
|
|
|
|
func f5() *byte {
|
|
type T struct {
|
|
x [1]byte
|
|
}
|
|
t := new(T) // ERROR "new.T. escapes to heap"
|
|
return &t.x[0] // ERROR "&t.x.0. escapes to heap"
|
|
}
|
|
|
|
func f6() *byte {
|
|
type T struct {
|
|
x struct {
|
|
y byte
|
|
}
|
|
}
|
|
t := new(T) // ERROR "new.T. escapes to heap"
|
|
return &t.x.y // ERROR "&t.x.y escapes to heap"
|
|
}
|