summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-03-29 15:27:59 -0700
committerRuss Cox <rsc@golang.org>2010-03-29 15:27:59 -0700
commit7f29727c0c5c3e6f12cadbfe988a3edade1d4e2a (patch)
treebe76e183f5ff4f9d4a07d59536b08c4647a8126d /src
parent5e7c998c247970cf7c1d95075317f91f6c38a534 (diff)
downloadgolang-7f29727c0c5c3e6f12cadbfe988a3edade1d4e2a.tar.gz
gc: bug265
Fixes issue 700. R=ken2 CC=golang-dev http://codereview.appspot.com/839041
Diffstat (limited to 'src')
-rw-r--r--src/cmd/gc/walk.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index fa6157bb0..b64d58e7f 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -328,6 +328,23 @@ samelist(NodeList *a, NodeList *b)
return a == b;
}
+static int
+paramoutheap(Node *fn)
+{
+ NodeList *l;
+
+ for(l=fn->dcl; l; l=l->next) {
+ switch(l->n->class) {
+ case PPARAMOUT|PHEAP:
+ return 1;
+ case PAUTO:
+ case PAUTO|PHEAP:
+ // stop early - parameters are over
+ return 0;
+ }
+ }
+ return 0;
+}
void
walkstmt(Node **np)
@@ -441,11 +458,9 @@ walkstmt(Node **np)
case ORETURN:
walkexprlist(n->list, &n->ninit);
- if(curfn->type->outnamed && count(n->list) != 1) {
- if(n->list == nil) {
- // print("special return\n");
- break;
- }
+ if(n->list == nil)
+ break;
+ if((curfn->type->outnamed && count(n->list) > 1) || paramoutheap(curfn)) {
// assign to the function out parameters,
// so that reorder3 can fix up conflicts
rl = nil;