github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/types/testdata/check/expr2.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // comparisons 6 7 package expr2 8 9 func _bool() { 10 const t = true == true 11 const f = true == false 12 _ = t /* ERRORx `operator .* not defined` */ < f 13 _ = 0 == t /* ERROR "mismatched types untyped int and untyped bool" */ 14 var b bool 15 var x, y float32 16 b = x < y 17 _ = b 18 _ = struct{b bool}{x < y} 19 } 20 21 // corner cases 22 var ( 23 v0 = nil == nil // ERROR "operator == not defined on untyped nil" 24 ) 25 26 func arrays() { 27 // basics 28 var a, b [10]int 29 _ = a == b 30 _ = a != b 31 _ = a /* ERROR "< not defined" */ < b 32 _ = a == nil /* ERROR "mismatched types" */ 33 34 type C [10]int 35 var c C 36 _ = a == c 37 38 type D [10]int 39 var d D 40 _ = c == d /* ERROR "mismatched types" */ 41 42 var e [10]func() int 43 _ = e /* ERROR "[10]func() int cannot be compared" */ == e 44 } 45 46 func structs() { 47 // basics 48 var s, t struct { 49 x int 50 a [10]float32 51 _ bool 52 } 53 _ = s == t 54 _ = s != t 55 _ = s /* ERROR "< not defined" */ < t 56 _ = s == nil /* ERROR "mismatched types" */ 57 58 type S struct { 59 x int 60 a [10]float32 61 _ bool 62 } 63 type T struct { 64 x int 65 a [10]float32 66 _ bool 67 } 68 var ss S 69 var tt T 70 _ = s == ss 71 _ = ss == tt /* ERROR "mismatched types" */ 72 73 var u struct { 74 x int 75 a [10]map[string]int 76 } 77 _ = u /* ERROR "cannot be compared" */ == u 78 } 79 80 func pointers() { 81 // nil 82 _ = nil == nil // ERROR "operator == not defined on untyped nil" 83 _ = nil != nil // ERROR "operator != not defined on untyped nil" 84 _ = nil /* ERROR "< not defined" */ < nil 85 _ = nil /* ERROR "<= not defined" */ <= nil 86 _ = nil /* ERROR "> not defined" */ > nil 87 _ = nil /* ERROR ">= not defined" */ >= nil 88 89 // basics 90 var p, q *int 91 _ = p == q 92 _ = p != q 93 94 _ = p == nil 95 _ = p != nil 96 _ = nil == q 97 _ = nil != q 98 99 _ = p /* ERROR "< not defined" */ < q 100 _ = p /* ERROR "<= not defined" */ <= q 101 _ = p /* ERROR "> not defined" */ > q 102 _ = p /* ERROR ">= not defined" */ >= q 103 104 // various element types 105 type ( 106 S1 struct{} 107 S2 struct{} 108 P1 *S1 109 P2 *S2 110 ) 111 var ( 112 ps1 *S1 113 ps2 *S2 114 p1 P1 115 p2 P2 116 ) 117 _ = ps1 == ps1 118 _ = ps1 == ps2 /* ERROR "mismatched types" */ 119 _ = ps2 == ps1 /* ERROR "mismatched types" */ 120 121 _ = p1 == p1 122 _ = p1 == p2 /* ERROR "mismatched types" */ 123 124 _ = p1 == ps1 125 } 126 127 func channels() { 128 // basics 129 var c, d chan int 130 _ = c == d 131 _ = c != d 132 _ = c == nil 133 _ = c /* ERROR "< not defined" */ < d 134 135 // various element types (named types) 136 type ( 137 C1 chan int 138 C1r <-chan int 139 C1s chan<- int 140 C2 chan float32 141 ) 142 var ( 143 c1 C1 144 c1r C1r 145 c1s C1s 146 c1a chan int 147 c2 C2 148 ) 149 _ = c1 == c1 150 _ = c1 == c1r /* ERROR "mismatched types" */ 151 _ = c1 == c1s /* ERROR "mismatched types" */ 152 _ = c1r == c1s /* ERROR "mismatched types" */ 153 _ = c1 == c1a 154 _ = c1a == c1 155 _ = c1 == c2 /* ERROR "mismatched types" */ 156 _ = c1a == c2 /* ERROR "mismatched types" */ 157 158 // various element types (unnamed types) 159 var ( 160 d1 chan int 161 d1r <-chan int 162 d1s chan<- int 163 d1a chan<- int 164 d2 chan float32 165 ) 166 _ = d1 == d1 167 _ = d1 == d1r 168 _ = d1 == d1s 169 _ = d1r == d1s /* ERROR "mismatched types" */ 170 _ = d1 == d1a 171 _ = d1a == d1 172 _ = d1 == d2 /* ERROR "mismatched types" */ 173 _ = d1a == d2 /* ERROR "mismatched types" */ 174 } 175 176 // for interfaces test 177 type S1 struct{} 178 type S11 struct{} 179 type S2 struct{} 180 func (*S1) m() int 181 func (*S11) m() int 182 func (*S11) n() 183 func (*S2) m() float32 184 185 func interfaces() { 186 // basics 187 var i, j interface{ m() int } 188 _ = i == j 189 _ = i != j 190 _ = i == nil 191 _ = i /* ERROR "< not defined" */ < j 192 193 // various interfaces 194 var ii interface { m() int; n() } 195 var k interface { m() float32 } 196 _ = i == ii 197 _ = i == k /* ERROR "mismatched types" */ 198 199 // interfaces vs values 200 var s1 S1 201 var s11 S11 202 var s2 S2 203 204 _ = i == 0 /* ERROR "cannot convert" */ 205 _ = i == s1 /* ERROR "mismatched types" */ 206 _ = i == &s1 207 _ = i == &s11 208 209 _ = i == s2 /* ERROR "mismatched types" */ 210 _ = i == & /* ERROR "mismatched types" */ s2 211 212 // issue #28164 213 // testcase from issue 214 _ = interface{}(nil) == [ /* ERROR "slice can only be compared to nil" */ ]int(nil) 215 216 // related cases 217 var e interface{} 218 var s []int 219 var x int 220 _ = e == s // ERROR "slice can only be compared to nil" 221 _ = s /* ERROR "slice can only be compared to nil" */ == e 222 _ = e /* ERROR "operator < not defined on interface" */ < x 223 _ = x < e // ERROR "operator < not defined on interface" 224 } 225 226 func slices() { 227 // basics 228 var s []int 229 _ = s == nil 230 _ = s != nil 231 _ = s /* ERROR "< not defined" */ < nil 232 233 // slices are not otherwise comparable 234 _ = s /* ERROR "slice can only be compared to nil" */ == s 235 _ = s /* ERROR "< not defined" */ < s 236 } 237 238 func maps() { 239 // basics 240 var m map[string]int 241 _ = m == nil 242 _ = m != nil 243 _ = m /* ERROR "< not defined" */ < nil 244 245 // maps are not otherwise comparable 246 _ = m /* ERROR "map can only be compared to nil" */ == m 247 _ = m /* ERROR "< not defined" */ < m 248 } 249 250 func funcs() { 251 // basics 252 var f func(int) float32 253 _ = f == nil 254 _ = f != nil 255 _ = f /* ERROR "< not defined" */ < nil 256 257 // funcs are not otherwise comparable 258 _ = f /* ERROR "func can only be compared to nil" */ == f 259 _ = f /* ERROR "< not defined" */ < f 260 }