mirror of
https://github.com/golang/go
synced 2024-11-24 23:07:56 -07:00
gc: bug271
Fixes #662. R=ken2 CC=golang-dev https://golang.org/cl/978043
This commit is contained in:
parent
560283c880
commit
253fd30e66
@ -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)
|
|||||||
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)
|
|||||||
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:
|
|||||||
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");
|
||||||
}
|
}
|
||||||
|
20
test/fixedbugs/bug271.go
Normal file
20
test/fixedbugs/bug271.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// $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")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user