mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
cmd/gc: steal escape analysis info when inlining
Usually, there is no esc info when inlining, but there will be when generating inlined wrapper functions. If we don't use this information, we get invalid addresses on the stack. Fixes #5056. R=golang-dev, rsc CC=golang-dev, remyoudompheng https://golang.org/cl/7850045
This commit is contained in:
parent
725519902f
commit
2667dcd113
2 changed files with 40 additions and 0 deletions
|
@ -797,6 +797,12 @@ inlvar(Node *var)
|
|||
n->class = PAUTO;
|
||||
n->used = 1;
|
||||
n->curfn = curfn; // the calling function, not the called one
|
||||
|
||||
// esc pass wont run if we're inlining into a iface wrapper
|
||||
// luckily, we can steal the results from the target func
|
||||
if(var->esc == EscHeap)
|
||||
addrescapes(n);
|
||||
|
||||
curfn->dcl = list(curfn->dcl, n);
|
||||
return n;
|
||||
}
|
||||
|
|
34
test/fixedbugs/issue5056.go
Normal file
34
test/fixedbugs/issue5056.go
Normal file
|
@ -0,0 +1,34 @@
|
|||
// run
|
||||
|
||||
// Copyright 2013 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.
|
||||
|
||||
// issue 5056: escape analysis not applied to wrapper functions
|
||||
|
||||
package main
|
||||
|
||||
type Foo int16
|
||||
|
||||
func (f Foo) Esc() *int{
|
||||
x := int(f)
|
||||
return &x
|
||||
}
|
||||
|
||||
type iface interface {
|
||||
Esc() *int
|
||||
}
|
||||
|
||||
var bar, foobar *int
|
||||
|
||||
func main() {
|
||||
var quux iface
|
||||
var x Foo
|
||||
|
||||
quux = x
|
||||
bar = quux.Esc()
|
||||
foobar = quux.Esc()
|
||||
if bar == foobar {
|
||||
panic("bar == foobar")
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue