1// errorcheck
2
3// Copyright 2010 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Verify that incorrect comparisons are detected.
8// Does not compile.
9
10package main
11
12func use(bool) {}
13
14type T1 *int
15type T2 *int
16
17type T3 struct{ z []int }
18
19var t3 T3
20
21type T4 struct { _ []int; a float64 }
22
23var t4 T4
24
25func main() {
26	// Arguments to comparison must be
27	// assignable one to the other (or vice versa)
28	// so chan int can be compared against
29	// directional channels but channel of different
30	// direction cannot be compared against each other.
31	var c1 chan<- int
32	var c2 <-chan int
33	var c3 chan int
34
35	use(c1 == c2) // ERROR "invalid operation|incompatible"
36	use(c2 == c1) // ERROR "invalid operation|incompatible"
37	use(c1 == c3)
38	use(c2 == c2)
39	use(c3 == c1)
40	use(c3 == c2)
41
42	// Same applies to named types.
43	var p1 T1
44	var p2 T2
45	var p3 *int
46
47	use(p1 == p2) // ERROR "invalid operation|incompatible"
48	use(p2 == p1) // ERROR "invalid operation|incompatible"
49	use(p1 == p3)
50	use(p2 == p2)
51	use(p3 == p1)
52	use(p3 == p2)
53
54	// Comparison of structs should have a good message
55	use(t3 == t3) // ERROR "struct|expected"
56	use(t4 == t4) // ERROR "cannot be compared|non-comparable"
57
58	// Slices, functions, and maps too.
59	var x []int
60	var f func()
61	var m map[int]int
62	use(x == x) // ERROR "slice can only be compared to nil"
63	use(f == f) // ERROR "func can only be compared to nil"
64	use(m == m) // ERROR "map can only be compared to nil"
65
66	// Comparison with interface that cannot return true
67	// (would panic).
68	var i interface{}
69	use(i == x) // ERROR "invalid operation"
70	use(x == i) // ERROR "invalid operation"
71	use(i == f) // ERROR "invalid operation"
72	use(f == i) // ERROR "invalid operation"
73	use(i == m) // ERROR "invalid operation"
74	use(m == i) // ERROR "invalid operation"
75}
76