summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorR?my Oudompheng <oudomphe@phare.normalesup.org>2012-08-03 21:47:26 +0200
committerR?my Oudompheng <oudomphe@phare.normalesup.org>2012-08-03 21:47:26 +0200
commit17d2c6a607781f51baa1cf375665f8c9fc532be6 (patch)
tree5bee39f1a3b55d16a6c6fb853fd162280e6e1283 /test
parent7e90822378f6d143e7b63fec6d22695fc379eed2 (diff)
downloadgo-17d2c6a607781f51baa1cf375665f8c9fc532be6.tar.gz
cmd/gc: accept switches on comparable arrays.
The compiler is incorrectly rejecting switches on arrays of comparable types. It also doesn't catch incomparable structs when typechecking the switch, leading to unreadable errors during typechecking of the generated code. Fixes issue 3894. R=rsc CC=gobot, golang-dev, r, remy http://codereview.appspot.com/6442074
Diffstat (limited to 'test')
-rw-r--r--test/switch.go32
-rw-r--r--test/switch3.go11
2 files changed, 43 insertions, 0 deletions
diff --git a/test/switch.go b/test/switch.go
index 09bf4341a..a4242f257 100644
--- a/test/switch.go
+++ b/test/switch.go
@@ -284,6 +284,38 @@ func main() {
default:
}
+ // switch on interface.
+ switch i := interface{}("hello"); i {
+ case 42:
+ assert(false, `i should be "hello"`)
+ case "hello":
+ assert(true, "hello")
+ default:
+ assert(false, `i should be "hello"`)
+ }
+
+ // switch on array.
+ switch ar := [3]int{1, 2, 3}; ar {
+ case [3]int{1,2,3}:
+ assert(true, "[1 2 3]")
+ case [3]int{4,5,6}:
+ assert(false, "ar should be [1 2 3]")
+ default:
+ assert(false, "ar should be [1 2 3]")
+ }
+
+ // switch on channel
+ switch c1, c2 := make(chan int), make(chan int); c1 {
+ case nil:
+ assert(false, "c1 did not match itself")
+ case c2:
+ assert(false, "c1 did not match itself")
+ case c1:
+ assert(true, "chan")
+ default:
+ assert(false, "c1 did not match itself")
+ }
+
i := 0
switch x := 5; {
case i < x:
diff --git a/test/switch3.go b/test/switch3.go
index dcb6fff20..28705e464 100644
--- a/test/switch3.go
+++ b/test/switch3.go
@@ -45,6 +45,17 @@ func bad() {
case f1: // ERROR "can only compare func f to nil|func can only be compared to nil"
default:
}
+
+ var ar, ar1 [4]func()
+ switch ar { // ERROR "cannot switch on"
+ case ar1:
+ default:
+ }
+
+ var st, st1 struct{ f func() }
+ switch st { // ERROR "cannot switch on"
+ case st1:
+ }
}
func good() {