diff options
author | Russ Cox <rsc@golang.org> | 2010-03-29 15:27:59 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-03-29 15:27:59 -0700 |
commit | 7f29727c0c5c3e6f12cadbfe988a3edade1d4e2a (patch) | |
tree | be76e183f5ff4f9d4a07d59536b08c4647a8126d /src | |
parent | 5e7c998c247970cf7c1d95075317f91f6c38a534 (diff) | |
download | golang-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.c | 25 |
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; |