Commit 2667dcd1 authored by Daniel Morsing's avatar Daniel Morsing

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
parent 72551990
......@@ -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;
}
......
// 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")
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment