mirror of
https://github.com/golang/go
synced 2024-09-23 21:20:13 -06:00
cmd/gc: accept cases with same value but different types in switch.
Fixes #4781. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/7365056
This commit is contained in:
parent
9e66ee4562
commit
71b3b46073
@ -117,12 +117,15 @@ exprcmp(Case *c1, Case *c2)
|
||||
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 @@ mkcaselist(Node *sw, int arg)
|
||||
case Strue:
|
||||
case Sfalse:
|
||||
c->type = Texprvar;
|
||||
c->hash = typehash(n->left->type);
|
||||
switch(consttype(n->left)) {
|
||||
case CTFLT:
|
||||
case CTINT:
|
||||
|
@ -305,6 +305,35 @@ func main() {
|
||||
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}:
|
||||
|
Loading…
Reference in New Issue
Block a user