Message:
Hello [email protected] (cc: [email protected]),
I'd like you to review this change to
https://go.googlecode.com/hg/
Description:
cmd/gc: accept cases with same value but different types in switch.
Fixes issue 4781.
Please review this at https://codereview.appspot.com/7365056/
Affected files:
M src/cmd/gc/swt.c
M test/switch.go
Index: src/cmd/gc/swt.c
===================================================================
--- a/src/cmd/gc/swt.c
+++ b/src/cmd/gc/swt.c
@@ -117,12 +117,15 @@
n1 = c1->node->left;
n2 = c2->node->left;
+ // sort by type (for switches on interface)
ct = n1->val.ctype;
- if(ct != n2->val.ctype) {
- // invalid program, but return a sort
- // order so that we can give a better
- // error later.
+ if(ct != n2->val.ctype)
return ct - n2->val.ctype;
+ if(!eqtype(n1->type, n2->type)) {
+ if(n1->type->vargen > n2->type->vargen)
+ return +1;
+ else
+ return -1;
}
// sort by constant value
@@ -379,6 +382,7 @@
case Strue:
case Sfalse:
c->type = Texprvar;
+ c->hash = typehash(n->left->type);
switch(consttype(n->left)) {
case CTFLT:
case CTINT:
Index: test/switch.go
===================================================================
--- a/test/switch.go
+++ b/test/switch.go
@@ -305,6 +305,35 @@
assert(false, "i should be true")
}
+ // switch on interface with constant cases differing by type.
+ // was rejected by compiler: see issue 4781
+ type T int
+ type B bool
+ type F float64
+ type S string
+ switch i := interface{}(float64(1.0)); i {
+ case nil:
+ assert(false, "i should be float64(1.0)")
+ case (*int)(nil):
+ assert(false, "i should be float64(1.0)")
+ case 1:
+ assert(false, "i should be float64(1.0)")
+ case T(1):
+ assert(false, "i should be float64(1.0)")
+ case F(1.0):
+ assert(false, "i should be float64(1.0)")
+ case 1.0:
+ assert(true, "true")
+ case "hello":
+ assert(false, "i should be float64(1.0)")
+ case S("hello"):
+ assert(false, "i should be float64(1.0)")
+ case true, B(false):
+ assert(false, "i should be float64(1.0)")
+ case false, B(true):
+ assert(false, "i should be float64(1.0)")
+ }
+
// switch on array.
switch ar := [3]int{1, 2, 3}; ar {
case [3]int{1, 2, 3}:
--
---
You received this message because you are subscribed to the Google Groups "golang-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.