diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 9eb92f0bbdd..0c436de0b99 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -1920,8 +1920,12 @@ typehash(Type *at, int addsym, int d) break; case TSTRUCT: - for(t=at->type; t!=T; t=t->down) - h += PRIME7 * typehash(t, addsym, d+1); + for(t=at->type; t!=T; t=t->down) { + if(at->funarg) // walk into TFIELD in function argument struct + h += PRIME7 * typehash(t->type, addsym, d+1); + else + h += PRIME7 * typehash(t, addsym, d+1); + } break; case TFUNC: diff --git a/src/cmd/gc/swt.c b/src/cmd/gc/swt.c index 17a44334894..0754d18f5a5 100644 --- a/src/cmd/gc/swt.c +++ b/src/cmd/gc/swt.c @@ -387,7 +387,7 @@ mkcaselist(Node *sw, int arg) continue; setlineno(c1->link->node); yyerror("duplicate case in switch"); - print(" previous case at %L\n", + print("\tprevious case at %L\n", c1->node->lineno); } break; @@ -400,7 +400,7 @@ mkcaselist(Node *sw, int arg) continue; setlineno(c1->link->node); yyerror("duplicate case in switch"); - print(" previous case at %L\n", + print("\tprevious case at %L\n", c1->node->lineno); } break; diff --git a/test/fixedbugs/bug200.go b/test/fixedbugs/bug200.go new file mode 100644 index 00000000000..123f6872805 --- /dev/null +++ b/test/fixedbugs/bug200.go @@ -0,0 +1,19 @@ +// errchk $G $D/$F.go + +// 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 main() { + // 6g used to compile these as two different + // hash codes so it missed the duplication + // and worse, compiled the wrong code + // for one of them. + var x interface{}; + switch v := x.(type) { + case func(int): + case func(f int): // ERROR "duplicate" + } +}