From 4c0de303ceb049b171f3cc43a4651a3f5a91b1da Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 15 Jul 2010 16:42:32 -0700 Subject: [PATCH] gc: bug294 Fixes #800. R=ken2 CC=golang-dev https://golang.org/cl/1855043 --- src/cmd/gc/walk.c | 41 ++++++++++++--------- test/fixedbugs/bug294.go | 79 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 test/fixedbugs/bug294.go diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 78365353b3c..bde6370a296 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -720,8 +720,8 @@ walkexpr(Node **np, NodeList **init) goto ret; walkexpr(&n->left, init); walkexprlist(n->list, init); - ll = ascompatte(n->op, getinarg(t), n->list, 0, init); - lr = ascompatte(n->op, getthis(t), list1(n->left->left), 0, init); + ll = ascompatte(n->op, getthis(t), list1(n->left->left), 0, init); + lr = ascompatte(n->op, getinarg(t), n->list, 0, init); ll = concat(ll, lr); n->left->left = N; ullmancalc(n->left); @@ -1474,47 +1474,51 @@ mkdotargslice(NodeList *lr0, NodeList *nn, Type *l, int fp, NodeList **init) /* * helpers for shape errors */ -static void +static char* dumptypes(Type **nl, char *what) { int first; Type *l; Iter savel; + Fmt fmt; + fmtstrinit(&fmt); + fmtprint(&fmt, "\t"); l = structfirst(&savel, nl); - print("\t"); first = 1; for(l = structfirst(&savel, nl); l != T; l = structnext(&savel)) { if(first) first = 0; else - print(", "); - print("%T", l); + fmtprint(&fmt, ", "); + fmtprint(&fmt, "%T", l); } if(first) - print("[no arguments %s]", what); - print("\n"); + fmtprint(&fmt, "[no arguments %s]", what); + return fmtstrflush(&fmt); } -static void +static char* dumpnodetypes(NodeList *l, char *what) { int first; Node *r; + Fmt fmt; - print("\t"); + fmtstrinit(&fmt); + fmtprint(&fmt, "\t"); first = 1; for(; l; l=l->next) { r = l->n; if(first) first = 0; else - print(", "); - print("%T", r->type); + fmtprint(&fmt, ", "); + fmtprint(&fmt, "%T", r->type); } if(first) - print("[no arguments %s]", what); - print("\n"); + fmtprint(&fmt, "[no arguments %s]", what); + return fmtstrflush(&fmt); } /* @@ -1530,6 +1534,7 @@ ascompatte(int op, Type **nl, NodeList *lr, int fp, NodeList **init) Node *r, *a; NodeList *nn, *lr0, *alist; Iter savel; + char *l1, *l2; lr0 = lr; l = structfirst(&savel, nl); @@ -1594,12 +1599,12 @@ loop: if(l == T || r == N) { if(l != T || r != N) { + l1 = dumptypes(nl, "expected"); + l2 = dumpnodetypes(lr0, "given"); if(l != T) - yyerror("not enough arguments to %O", op); + yyerror("not enough arguments to %O\n%s\n%s", op, l1, l2); else - yyerror("too many arguments to %O", op); - dumptypes(nl, "expected"); - dumpnodetypes(lr0, "given"); + yyerror("too many arguments to %O\n%s\n%s", op, l1, l2); } goto ret; } diff --git a/test/fixedbugs/bug294.go b/test/fixedbugs/bug294.go new file mode 100644 index 00000000000..18f45931c4b --- /dev/null +++ b/test/fixedbugs/bug294.go @@ -0,0 +1,79 @@ +// $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=800 + +package main + +var log string + +type T int + +func (t T) a(s string) T { + log += "a(" + s + ")" + return t +} + +func (T) b(s string) string { + log += "b" + return s +} + +type F func(s string) F + +func a(s string) F { + log += "a(" + s + ")" + return F(a) +} + +func b(s string) string { + log += "b" + return s +} + +type I interface { + a(s string) I + b(s string) string +} + +type T1 int + +func (t T1) a(s string) I { + log += "a(" + s + ")" + return t +} + +func (T1) b(s string) string { + log += "b" + return s +} + +var ok = true + +func bad() { + if !ok { + println("BUG") + ok = false + } + println(log) +} + +func main() { + var t T + if t.a("1").a(t.b("2")); log != "a(1)ba(2)" { + bad() + } + log = "" + if a("3")(b("4"))(b("5")); log != "a(3)ba(4)ba(5)" { + bad() + } + log = "" + var i I = T1(0) + if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)ba(7)ba(8)ba(9)" { + bad() + } +} +