From 7cfa8310c75bfe8534a61f0f64116cb508d6f10d Mon Sep 17 00:00:00 2001 From: Daniel Morsing Date: Tue, 2 Jul 2013 17:12:08 +0200 Subject: [PATCH] cmd/gc: fix issue with method wrappers not having escape analysis run on them. Escape analysis needs the right curfn value on a dclfunc node, otherwise it will not analyze the function. When generating method value wrappers, we forgot to set the curfn correctly. Fixes #5753. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/10383048 --- src/cmd/gc/closure.c | 7 ++++++- test/fixedbugs/issue5753.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue5753.go diff --git a/src/cmd/gc/closure.c b/src/cmd/gc/closure.c index d81c5281dd..996504a114 100644 --- a/src/cmd/gc/closure.c +++ b/src/cmd/gc/closure.c @@ -280,7 +280,7 @@ typecheckpartialcall(Node *fn, Node *sym) static Node* makepartialcall(Node *fn, Type *t0, Node *meth) { - Node *ptr, *n, *fld, *call, *xtype, *xfunc, *cv; + Node *ptr, *n, *fld, *call, *xtype, *xfunc, *cv, *savecurfn; Type *rcvrtype, *basetype, *t; NodeList *body, *l, *callargs, *retargs; char *p; @@ -304,6 +304,9 @@ makepartialcall(Node *fn, Type *t0, Node *meth) if(sym->flags & SymUniq) return sym->def; sym->flags |= SymUniq; + + savecurfn = curfn; + curfn = N; xtype = nod(OTFUNC, N, N); i = 0; @@ -311,6 +314,7 @@ makepartialcall(Node *fn, Type *t0, Node *meth) callargs = nil; ddd = 0; xfunc = nod(ODCLFUNC, N, N); + curfn = xfunc; for(t = getinargx(t0)->type; t; t = t->down) { snprint(namebuf, sizeof namebuf, "a%d", i++); n = newname(lookup(namebuf)); @@ -385,6 +389,7 @@ makepartialcall(Node *fn, Type *t0, Node *meth) typecheck(&xfunc, Etop); sym->def = xfunc; xtop = list(xtop, xfunc); + curfn = savecurfn; return xfunc; } diff --git a/test/fixedbugs/issue5753.go b/test/fixedbugs/issue5753.go new file mode 100644 index 0000000000..230a1e8c3b --- /dev/null +++ b/test/fixedbugs/issue5753.go @@ -0,0 +1,29 @@ +// 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 5753: bad typecheck info causes escape analysis to +// not run on method thunks. + +package main + +type Thing struct{} + +func (t *Thing) broken(s string) []string { + foo := [1]string{s} + return foo[:] +} + +func main() { + t := &Thing{} + + f := t.broken + s := f("foo") + _ = f("bar") + if s[0] != "foo" { + panic(`s[0] != "foo"`) + } + +} -- 2.48.1