Home | History | Annotate | Download | only in test
      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 }
    489