Source file test/cmp6.go

     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  
    10  package main
    11  
    12  func use(bool) {}
    13  
    14  type T1 *int
    15  type T2 *int
    16  
    17  type T3 struct{ z []int }
    18  
    19  var t3 T3
    20  
    21  type T4 struct {
    22  	_ []int
    23  	a float64
    24  }
    25  
    26  var t4 T4
    27  
    28  func main() {
    29  	// Arguments to comparison must be
    30  	// assignable one to the other (or vice versa)
    31  	// so chan int can be compared against
    32  	// directional channels but channel of different
    33  	// direction cannot be compared against each other.
    34  	var c1 chan<- int
    35  	var c2 <-chan int
    36  	var c3 chan int
    37  
    38  	use(c1 == c2) // ERROR "invalid operation|incompatible"
    39  	use(c2 == c1) // ERROR "invalid operation|incompatible"
    40  	use(c1 == c3)
    41  	use(c2 == c2)
    42  	use(c3 == c1)
    43  	use(c3 == c2)
    44  
    45  	// Same applies to named types.
    46  	var p1 T1
    47  	var p2 T2
    48  	var p3 *int
    49  
    50  	use(p1 == p2) // ERROR "invalid operation|incompatible"
    51  	use(p2 == p1) // ERROR "invalid operation|incompatible"
    52  	use(p1 == p3)
    53  	use(p2 == p2)
    54  	use(p3 == p1)
    55  	use(p3 == p2)
    56  
    57  	// Arrays are comparable if and only if their element type is comparable.
    58  	var a1 [1]int
    59  	var a2 [1]func()
    60  	var a3 [0]func()
    61  	use(a1 == a1)
    62  	use(a2 == a2) // ERROR "invalid operation|invalid comparison"
    63  	use(a3 == a3) // ERROR "invalid operation|invalid comparison"
    64  
    65  	// Comparison of structs should have a good message
    66  	use(t3 == t3) // ERROR "struct|expected|cannot compare"
    67  	use(t4 == t4) // ERROR "cannot be compared|non-comparable|cannot compare"
    68  
    69  	// Slices, functions, and maps too.
    70  	var x []int
    71  	var f func()
    72  	var m map[int]int
    73  	use(x == x) // ERROR "slice can only be compared to nil|cannot compare"
    74  	use(f == f) // ERROR "func can only be compared to nil|cannot compare"
    75  	use(m == m) // ERROR "map can only be compared to nil|cannot compare"
    76  
    77  	// Comparison with interface that cannot return true
    78  	// (would panic).
    79  	var i interface{}
    80  	use(i == x) // ERROR "invalid operation"
    81  	use(x == i) // ERROR "invalid operation"
    82  	use(i == f) // ERROR "invalid operation"
    83  	use(f == i) // ERROR "invalid operation"
    84  	use(i == m) // ERROR "invalid operation"
    85  	use(m == i) // ERROR "invalid operation"
    86  }
    87  

View as plain text