Commit 253fd30e authored by Russ Cox's avatar Russ Cox

gc: bug271

Fixes #662.

R=ken2
CC=golang-dev
https://golang.org/cl/978043
parent 560283c8
...@@ -1618,7 +1618,7 @@ ascompatte(int op, Type **nl, NodeList *lr, int fp, NodeList **init) ...@@ -1618,7 +1618,7 @@ ascompatte(int op, Type **nl, NodeList *lr, int fp, NodeList **init)
Type *l, *ll; Type *l, *ll;
Node *r, *a; Node *r, *a;
NodeList *nn, *lr0, *alist; NodeList *nn, *lr0, *alist;
Iter savel, peekl; Iter savel;
lr0 = lr; lr0 = lr;
l = structfirst(&savel, nl); l = structfirst(&savel, nl);
...@@ -1626,11 +1626,9 @@ ascompatte(int op, Type **nl, NodeList *lr, int fp, NodeList **init) ...@@ -1626,11 +1626,9 @@ ascompatte(int op, Type **nl, NodeList *lr, int fp, NodeList **init)
if(lr) if(lr)
r = lr->n; r = lr->n;
nn = nil; nn = nil;
// 1 to many // f(g()) where g has multiple return values
peekl = savel; if(r != N && lr->next == nil && r->type->etype == TSTRUCT && r->type->funarg) {
if(l != T && r != N && structnext(&peekl) != T && lr->next == nil
&& r->type->etype == TSTRUCT && r->type->funarg) {
// optimization - can do block copy // optimization - can do block copy
if(eqtypenoname(r->type, *nl)) { if(eqtypenoname(r->type, *nl)) {
a = nodarg(*nl, fp); a = nodarg(*nl, fp);
...@@ -1638,6 +1636,7 @@ ascompatte(int op, Type **nl, NodeList *lr, int fp, NodeList **init) ...@@ -1638,6 +1636,7 @@ ascompatte(int op, Type **nl, NodeList *lr, int fp, NodeList **init)
nn = list1(convas(nod(OAS, a, r), init)); nn = list1(convas(nod(OAS, a, r), init));
goto ret; goto ret;
} }
// conversions involved. // conversions involved.
// copy into temporaries. // copy into temporaries.
alist = nil; alist = nil;
...@@ -1689,9 +1688,9 @@ loop: ...@@ -1689,9 +1688,9 @@ loop:
if(l == T || r == N) { if(l == T || r == N) {
if(l != T || r != N) { if(l != T || r != N) {
if(l != T) if(l != T)
yyerror("xxx not enough arguments to %O", op); yyerror("not enough arguments to %O", op);
else else
yyerror("xxx too many arguments to %O", op); yyerror("too many arguments to %O", op);
dumptypes(nl, "expected"); dumptypes(nl, "expected");
dumpnodetypes(lr0, "given"); dumpnodetypes(lr0, "given");
} }
......
// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2010 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.
// http://code.google.com/p/go/issues/detail?id=662
package main
import "fmt"
func f() (int, int) { return 1, 2 }
func main() {
s := fmt.Sprint(f())
if s != "1 2" { // with bug, was "{1 2}"
println("BUG")
}
}
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