From 2667dcd113545593f785ca928d91161444248101 Mon Sep 17 00:00:00 2001 From: Daniel Morsing Date: Mon, 18 Mar 2013 22:22:35 +0100 Subject: [PATCH] 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 --- src/cmd/gc/inl.c | 6 ++++++ test/fixedbugs/issue5056.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 test/fixedbugs/issue5056.go 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") + } +} -- 2.50.0