OSDN Git Service

compiler, runtime: Implement struct and array comparisons.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / go.test / test / cmp6.go
index b3ea8ff..0113a69 100644 (file)
@@ -11,7 +11,7 @@ func use(bool) {}
 type T1 *int
 type T2 *int
 
-type T3 struct {}
+type T3 struct{ z []int }
 
 var t3 T3
 
@@ -21,12 +21,12 @@ func main() {
        // so chan int can be compared against
        // directional channels but channel of different
        // direction cannot be compared against each other.
-       var c1 chan <-int
+       var c1 chan<- int
        var c2 <-chan int
        var c3 chan int
-       
-       use(c1 == c2)   // ERROR "invalid operation|incompatible"
-       use(c2 == c1)   // ERROR "invalid operation|incompatible"
+
+       use(c1 == c2) // ERROR "invalid operation|incompatible"
+       use(c2 == c1) // ERROR "invalid operation|incompatible"
        use(c1 == c3)
        use(c2 == c2)
        use(c3 == c1)
@@ -36,14 +36,32 @@ func main() {
        var p1 T1
        var p2 T2
        var p3 *int
-       
-       use(p1 == p2)   // ERROR "invalid operation|incompatible"
-       use(p2 == p1)   // ERROR "invalid operation|incompatible"
+
+       use(p1 == p2) // ERROR "invalid operation|incompatible"
+       use(p2 == p1) // ERROR "invalid operation|incompatible"
        use(p1 == p3)
        use(p2 == p2)
        use(p3 == p1)
        use(p3 == p2)
-       
+
        // Comparison of structs should have a good message
-       use(t3 == t3)   // ERROR "struct|expected"
+       use(t3 == t3) // ERROR "struct|expected"
+
+       // Slices, functions, and maps too.
+       var x []int
+       var f func()
+       var m map[int]int
+       use(x == x) // ERROR "slice can only be compared to nil"
+       use(f == f) // ERROR "func can only be compared to nil"
+       use(m == m) // ERROR "map can only be compared to nil"
+
+       // Comparison with interface that cannot return true
+       // (would panic).
+       var i interface{}
+       use(i == x) // ERROR "invalid operation"
+       use(x == i) // ERROR "invalid operation"
+       use(i == f) // ERROR "invalid operation"
+       use(f == i) // ERROR "invalid operation"
+       use(i == m) // ERROR "invalid operation"
+       use(m == i) // ERROR "invalid operation"
 }