aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gerrand <adg@golang.org>2013-07-22 23:45:28 +1000
committerAndrew Gerrand <adg@golang.org>2013-07-22 23:45:28 +1000
commitb82120bd3e383b02d907b8b78d7b65020c65e702 (patch)
tree4ce9219478a9e0b1de4d4f5e7f663f5e46cd2395
parentb315b7ffffdf6d553292dc417a1a8913865b7611 (diff)
downloadgo-b82120bd3e383b02d907b8b78d7b65020c65e702.tar.gz
go-b82120bd3e383b02d907b8b78d7b65020c65e702.zip
[release-branch.go1.1] cmd/gc: fix issue with method wrappers not having escape analysis run on them.
««« CL 10383048 / 58e15340e78f 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 »»» Update #5928 R=golang-dev, dave CC=golang-dev https://golang.org/cl/11669043
-rw-r--r--src/cmd/gc/closure.c7
-rw-r--r--test/fixedbugs/issue5753.go29
2 files changed, 35 insertions, 1 deletions
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"`)
+ }
+
+}