Commit 39b12e2d authored by Russ Cox's avatar Russ Cox

bug185 - return b,a from func() (a,b int)

R=ken
OCL=32900
CL=32900
parent 0ab8dbef
...@@ -247,12 +247,22 @@ walkstmtlist(NodeList *l) ...@@ -247,12 +247,22 @@ walkstmtlist(NodeList *l)
walkstmt(&l->n); walkstmt(&l->n);
} }
static int
samelist(NodeList *a, NodeList *b)
{
for(; a && b; a=a->next, b=b->next)
if(a->n != b->n)
return 0;
return a == b;
}
void void
walkstmt(Node **np) walkstmt(Node **np)
{ {
NodeList *init; NodeList *init;
NodeList *ll; NodeList *ll, *rl;
int lno; int cl, lno;
Node *n; Node *n;
n = *np; n = *np;
...@@ -350,10 +360,30 @@ walkstmt(Node **np) ...@@ -350,10 +360,30 @@ walkstmt(Node **np)
case ORETURN: case ORETURN:
walkexprlist(n->list, &n->ninit); walkexprlist(n->list, &n->ninit);
if(curfn->type->outnamed && n->list == nil) { if(curfn->type->outnamed && count(n->list) != 1) {
if(n->list == nil) {
// print("special return\n"); // print("special return\n");
break; break;
} }
// assign to the function out parameters,
// so that reorder3 can fix up conflicts
rl = nil;
for(ll=curfn->dcl; ll != nil; ll=ll->next) {
cl = ll->n->class & ~PHEAP;
if(cl == PAUTO)
break;
if(cl == PPARAMOUT)
rl = list(rl, ll->n);
}
if(samelist(rl, n->list)) {
// special return in disguise
n->list = nil;
break;
}
ll = ascompatee(n->op, rl, n->list, &n->ninit);
n->list = reorder3(ll);
break;
}
ll = ascompatte(n->op, getoutarg(curfn->type), n->list, 1, &n->ninit); ll = ascompatte(n->op, getoutarg(curfn->type), n->list, 1, &n->ninit);
n->list = reorder4(ll); n->list = reorder4(ll);
break; break;
......
// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2009 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.
package main
func g() { }
func f1() (a, b int) {
a, b = 2, 1;
g(); // defeat optimizer
return a, b;
}
func f2() (a, b int) {
a, b = 1, 2;
g(); // defeat optimizer
return b, a;
}
func main() {
x, y := f1();
if x != 2 || y != 1 {
panicln("f1", x, y);
}
x, y = f2();
if x != 2 || y != 1 {
panicln("f2", x, y);
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment