modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/cmp.go (about) 1 // run 2 3 // Copyright 2009 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 // Test equality and inequality operations. 8 9 package main 10 11 import ( 12 "os" 13 "unsafe" 14 ) 15 16 var global bool 17 18 func use(b bool) { global = b } 19 20 func stringptr(s string) uintptr { return *(*uintptr)(unsafe.Pointer(&s)) } 21 22 func isfalse(b bool) { 23 if b { 24 // stack will explain where 25 panic("wanted false, got true") 26 } 27 } 28 29 func istrue(b bool) { 30 if !b { 31 // stack will explain where 32 panic("wanted true, got false") 33 } 34 } 35 36 type T *int 37 38 type X int 39 40 func (X) x() {} 41 42 func main() { 43 var a []int 44 var b map[string]int 45 46 var c string = "hello" 47 var d string = "hel" // try to get different pointer 48 d = d + "lo" 49 50 // go.tools/ssa/interp can't handle unsafe.Pointer. 51 if os.Getenv("GOSSAINTERP") == "" { 52 if stringptr(c) == stringptr(d) { 53 panic("compiler too smart -- got same string") 54 } 55 } 56 57 var e = make(chan int) 58 59 var ia interface{} = a 60 var ib interface{} = b 61 var ic interface{} = c 62 var id interface{} = d 63 var ie interface{} = e 64 65 // these comparisons are okay because 66 // string compare is okay and the others 67 // are comparisons where the types differ. 68 isfalse(ia == ib) 69 isfalse(ia == ic) 70 isfalse(ia == id) 71 isfalse(ib == ic) 72 isfalse(ib == id) 73 istrue(ic == id) 74 istrue(ie == ie) 75 76 istrue(ia != ib) 77 istrue(ia != ic) 78 istrue(ia != id) 79 istrue(ib != ic) 80 istrue(ib != id) 81 isfalse(ic != id) 82 isfalse(ie != ie) 83 84 // these are not okay, because there is no comparison on slices or maps. 85 //isfalse(a == ib) 86 //isfalse(a == ic) 87 //isfalse(a == id) 88 //isfalse(b == ic) 89 //isfalse(b == id) 90 91 istrue(c == id) 92 istrue(e == ie) 93 94 //isfalse(ia == b) 95 isfalse(ia == c) 96 isfalse(ia == d) 97 isfalse(ib == c) 98 isfalse(ib == d) 99 istrue(ic == d) 100 istrue(ie == e) 101 102 //istrue(a != ib) 103 //istrue(a != ic) 104 //istrue(a != id) 105 //istrue(b != ic) 106 //istrue(b != id) 107 isfalse(c != id) 108 isfalse(e != ie) 109 110 //istrue(ia != b) 111 istrue(ia != c) 112 istrue(ia != d) 113 istrue(ib != c) 114 istrue(ib != d) 115 isfalse(ic != d) 116 isfalse(ie != e) 117 118 // gc used to let this go through as true. 119 var g uint64 = 123 120 var h int64 = 123 121 var ig interface{} = g 122 var ih interface{} = h 123 isfalse(ig == ih) 124 istrue(ig != ih) 125 126 // map of interface should use == on interface values, 127 // not memory. 128 var m = make(map[interface{}]int) 129 m[ic] = 1 130 m[id] = 2 131 if m[c] != 2 { 132 println("m[c] = ", m[c]) 133 panic("bad m[c]") 134 } 135 136 // interface comparisons (issue 7207) 137 { 138 type I1 interface { 139 x() 140 } 141 type I2 interface { 142 x() 143 } 144 a1 := I1(X(0)) 145 b1 := I1(X(1)) 146 a2 := I2(X(0)) 147 b2 := I2(X(1)) 148 a3 := I1(a2) 149 a4 := I2(a1) 150 var e interface{} = X(0) 151 a5 := e.(I1) 152 a6 := e.(I2) 153 isfalse(a1 == b1) 154 isfalse(a1 == b2) 155 isfalse(a2 == b1) 156 isfalse(a2 == b2) 157 istrue(a1 == a2) 158 istrue(a1 == a3) 159 istrue(a1 == a4) 160 istrue(a1 == a5) 161 istrue(a1 == a6) 162 istrue(a2 == a3) 163 istrue(a2 == a4) 164 istrue(a2 == a5) 165 istrue(a2 == a6) 166 istrue(a3 == a4) 167 istrue(a3 == a5) 168 istrue(a3 == a6) 169 istrue(a4 == a5) 170 istrue(a4 == a6) 171 istrue(a5 == a6) 172 } 173 174 // non-interface comparisons 175 { 176 c := make(chan int) 177 c1 := (<-chan int)(c) 178 c2 := (chan<- int)(c) 179 istrue(c == c1) 180 istrue(c == c2) 181 istrue(c1 == c) 182 istrue(c2 == c) 183 184 isfalse(c != c1) 185 isfalse(c != c2) 186 isfalse(c1 != c) 187 isfalse(c2 != c) 188 189 d := make(chan int) 190 isfalse(c == d) 191 isfalse(d == c) 192 isfalse(d == c1) 193 isfalse(d == c2) 194 isfalse(c1 == d) 195 isfalse(c2 == d) 196 197 istrue(c != d) 198 istrue(d != c) 199 istrue(d != c1) 200 istrue(d != c2) 201 istrue(c1 != d) 202 istrue(c2 != d) 203 } 204 205 // named types vs not 206 { 207 var x = new(int) 208 var y T 209 var z T = x 210 211 isfalse(x == y) 212 istrue(x == z) 213 isfalse(y == z) 214 215 isfalse(y == x) 216 istrue(z == x) 217 isfalse(z == y) 218 219 istrue(x != y) 220 isfalse(x != z) 221 istrue(y != z) 222 223 istrue(y != x) 224 isfalse(z != x) 225 istrue(z != y) 226 } 227 228 // structs 229 { 230 var x = struct { 231 x int 232 y string 233 }{1, "hi"} 234 var y = struct { 235 x int 236 y string 237 }{2, "bye"} 238 var z = struct { 239 x int 240 y string 241 }{1, "hi"} 242 243 isfalse(x == y) 244 isfalse(y == x) 245 isfalse(y == z) 246 isfalse(z == y) 247 istrue(x == z) 248 istrue(z == x) 249 250 istrue(x != y) 251 istrue(y != x) 252 istrue(y != z) 253 istrue(z != y) 254 isfalse(x != z) 255 isfalse(z != x) 256 257 var m = make(map[struct { 258 x int 259 y string 260 }]int) 261 m[x] = 10 262 m[y] = 20 263 m[z] = 30 264 istrue(m[x] == 30) 265 istrue(m[y] == 20) 266 istrue(m[z] == 30) 267 istrue(m[x] != 10) 268 isfalse(m[x] != 30) 269 isfalse(m[y] != 20) 270 isfalse(m[z] != 30) 271 isfalse(m[x] == 10) 272 273 var m1 = make(map[struct { 274 x int 275 y string 276 }]struct { 277 x int 278 y string 279 }) 280 m1[x] = x 281 m1[y] = y 282 m1[z] = z 283 istrue(m1[x] == z) 284 istrue(m1[y] == y) 285 istrue(m1[z] == z) 286 istrue(m1[x] == x) 287 isfalse(m1[x] != z) 288 isfalse(m1[y] != y) 289 isfalse(m1[z] != z) 290 isfalse(m1[x] != x) 291 292 var ix, iy, iz interface{} = x, y, z 293 294 isfalse(ix == iy) 295 isfalse(iy == ix) 296 isfalse(iy == iz) 297 isfalse(iz == iy) 298 istrue(ix == iz) 299 istrue(iz == ix) 300 301 isfalse(x == iy) 302 isfalse(y == ix) 303 isfalse(y == iz) 304 isfalse(z == iy) 305 istrue(x == iz) 306 istrue(z == ix) 307 308 isfalse(ix == y) 309 isfalse(iy == x) 310 isfalse(iy == z) 311 isfalse(iz == y) 312 istrue(ix == z) 313 istrue(iz == x) 314 315 istrue(ix != iy) 316 istrue(iy != ix) 317 istrue(iy != iz) 318 istrue(iz != iy) 319 isfalse(ix != iz) 320 isfalse(iz != ix) 321 322 istrue(x != iy) 323 istrue(y != ix) 324 istrue(y != iz) 325 istrue(z != iy) 326 isfalse(x != iz) 327 isfalse(z != ix) 328 329 istrue(ix != y) 330 istrue(iy != x) 331 istrue(iy != z) 332 istrue(iz != y) 333 isfalse(ix != z) 334 isfalse(iz != x) 335 } 336 337 // structs with _ fields 338 { 339 var x = struct { 340 x int 341 _ string 342 y float64 343 _ float64 344 z int 345 }{ 346 x: 1, y: 2, z: 3, 347 } 348 var ix interface{} = x 349 350 istrue(x == x) 351 istrue(x == ix) 352 istrue(ix == x) 353 istrue(ix == ix) 354 } 355 356 // arrays 357 { 358 var x = [2]string{"1", "hi"} 359 var y = [2]string{"2", "bye"} 360 var z = [2]string{"1", "hi"} 361 362 isfalse(x == y) 363 isfalse(y == x) 364 isfalse(y == z) 365 isfalse(z == y) 366 istrue(x == z) 367 istrue(z == x) 368 369 istrue(x != y) 370 istrue(y != x) 371 istrue(y != z) 372 istrue(z != y) 373 isfalse(x != z) 374 isfalse(z != x) 375 376 var m = make(map[[2]string]int) 377 m[x] = 10 378 m[y] = 20 379 m[z] = 30 380 istrue(m[x] == 30) 381 istrue(m[y] == 20) 382 istrue(m[z] == 30) 383 isfalse(m[x] != 30) 384 isfalse(m[y] != 20) 385 isfalse(m[z] != 30) 386 387 var ix, iy, iz interface{} = x, y, z 388 389 isfalse(ix == iy) 390 isfalse(iy == ix) 391 isfalse(iy == iz) 392 isfalse(iz == iy) 393 istrue(ix == iz) 394 istrue(iz == ix) 395 396 isfalse(x == iy) 397 isfalse(y == ix) 398 isfalse(y == iz) 399 isfalse(z == iy) 400 istrue(x == iz) 401 istrue(z == ix) 402 403 isfalse(ix == y) 404 isfalse(iy == x) 405 isfalse(iy == z) 406 isfalse(iz == y) 407 istrue(ix == z) 408 istrue(iz == x) 409 410 istrue(ix != iy) 411 istrue(iy != ix) 412 istrue(iy != iz) 413 istrue(iz != iy) 414 isfalse(ix != iz) 415 isfalse(iz != ix) 416 417 istrue(x != iy) 418 istrue(y != ix) 419 istrue(y != iz) 420 istrue(z != iy) 421 isfalse(x != iz) 422 isfalse(z != ix) 423 424 istrue(ix != y) 425 istrue(iy != x) 426 istrue(iy != z) 427 istrue(iz != y) 428 isfalse(ix != z) 429 isfalse(iz != x) 430 } 431 432 // named booleans 433 { 434 type mybool bool 435 var b mybool 436 437 type T struct{ data [20]byte } 438 var x, y T 439 b = x == y 440 istrue(x == y) 441 istrue(bool(b)) 442 443 m := make(map[string][10]interface{}) 444 b = m["x"] == m["y"] 445 istrue(m["x"] == m["y"]) 446 istrue(bool(b)) 447 } 448 449 shouldPanic(p1) 450 shouldPanic(p2) 451 shouldPanic(p3) 452 shouldPanic(p4) 453 } 454 455 func p1() { 456 var a []int 457 var ia interface{} = a 458 use(ia == ia) 459 } 460 461 func p2() { 462 var b []int 463 var ib interface{} = b 464 use(ib == ib) 465 } 466 467 func p3() { 468 var a []int 469 var ia interface{} = a 470 var m = make(map[interface{}]int) 471 m[ia] = 1 472 } 473 474 func p4() { 475 var b []int 476 var ib interface{} = b 477 var m = make(map[interface{}]int) 478 m[ib] = 1 479 } 480 481 func shouldPanic(f func()) { 482 defer func() { 483 if recover() == nil { 484 panic("function should panic") 485 } 486 }() 487 f() 488 }