diff --git a/src/cmd/gc/inl.c b/src/cmd/gc/inl.c index f80aa9559b..7fc09025ba 100644 --- a/src/cmd/gc/inl.c +++ b/src/cmd/gc/inl.c @@ -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; } diff --git a/test/fixedbugs/issue5056.go b/test/fixedbugs/issue5056.go new file mode 100644 index 0000000000..a2cde2a501 --- /dev/null +++ b/test/fixedbugs/issue5056.go @@ -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") + } +}