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:
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;
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;
--- /dev/null
+// 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"
+ }
+}