github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/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  func main() {
    39  	var a []int
    40  	var b map[string]int
    41  
    42  	var c string = "hello"
    43  	var d string = "hel" // try to get different pointer
    44  	d = d + "lo"
    45  
    46  	// go.tools/ssa/interp can't handle unsafe.Pointer.
    47  	if os.Getenv("GOSSAINTERP") == "" {
    48  		if stringptr(c) == stringptr(d) {
    49  			panic("compiler too smart -- got same string")
    50  		}
    51  	}
    52  
    53  	var e = make(chan int)
    54  
    55  	var ia interface{} = a
    56  	var ib interface{} = b
    57  	var ic interface{} = c
    58  	var id interface{} = d
    59  	var ie interface{} = e
    60  
    61  	// these comparisons are okay because
    62  	// string compare is okay and the others
    63  	// are comparisons where the types differ.
    64  	isfalse(ia == ib)
    65  	isfalse(ia == ic)
    66  	isfalse(ia == id)
    67  	isfalse(ib == ic)
    68  	isfalse(ib == id)
    69  	istrue(ic == id)
    70  	istrue(ie == ie)
    71  
    72  	istrue(ia != ib)
    73  	istrue(ia != ic)
    74  	istrue(ia != id)
    75  	istrue(ib != ic)
    76  	istrue(ib != id)
    77  	isfalse(ic != id)
    78  	isfalse(ie != ie)
    79  
    80  	// these are not okay, because there is no comparison on slices or maps.
    81  	//isfalse(a == ib)
    82  	//isfalse(a == ic)
    83  	//isfalse(a == id)
    84  	//isfalse(b == ic)
    85  	//isfalse(b == id)
    86  
    87  	istrue(c == id)
    88  	istrue(e == ie)
    89  
    90  	//isfalse(ia == b)
    91  	isfalse(ia == c)
    92  	isfalse(ia == d)
    93  	isfalse(ib == c)
    94  	isfalse(ib == d)
    95  	istrue(ic == d)
    96  	istrue(ie == e)
    97  
    98  	//istrue(a != ib)
    99  	//istrue(a != ic)
   100  	//istrue(a != id)
   101  	//istrue(b != ic)
   102  	//istrue(b != id)
   103  	isfalse(c != id)
   104  	isfalse(e != ie)
   105  
   106  	//istrue(ia != b)
   107  	istrue(ia != c)
   108  	istrue(ia != d)
   109  	istrue(ib != c)
   110  	istrue(ib != d)
   111  	isfalse(ic != d)
   112  	isfalse(ie != e)
   113  
   114  	// 6g used to let this go through as true.
   115  	var g uint64 = 123
   116  	var h int64 = 123
   117  	var ig interface{} = g
   118  	var ih interface{} = h
   119  	isfalse(ig == ih)
   120  	istrue(ig != ih)
   121  
   122  	// map of interface should use == on interface values,
   123  	// not memory.
   124  	var m = make(map[interface{}]int)
   125  	m[ic] = 1
   126  	m[id] = 2
   127  	if m[c] != 2 {
   128  		println("m[c] = ", m[c])
   129  		panic("bad m[c]")
   130  	}
   131  
   132  	// non-interface comparisons
   133  	{
   134  		c := make(chan int)
   135  		c1 := (<-chan int)(c)
   136  		c2 := (chan<- int)(c)
   137  		istrue(c == c1)
   138  		istrue(c == c2)
   139  		istrue(c1 == c)
   140  		istrue(c2 == c)
   141  
   142  		isfalse(c != c1)
   143  		isfalse(c != c2)
   144  		isfalse(c1 != c)
   145  		isfalse(c2 != c)
   146  
   147  		d := make(chan int)
   148  		isfalse(c == d)
   149  		isfalse(d == c)
   150  		isfalse(d == c1)
   151  		isfalse(d == c2)
   152  		isfalse(c1 == d)
   153  		isfalse(c2 == d)
   154  
   155  		istrue(c != d)
   156  		istrue(d != c)
   157  		istrue(d != c1)
   158  		istrue(d != c2)
   159  		istrue(c1 != d)
   160  		istrue(c2 != d)
   161  	}
   162  
   163  	// named types vs not
   164  	{
   165  		var x = new(int)
   166  		var y T
   167  		var z T = x
   168  
   169  		isfalse(x == y)
   170  		istrue(x == z)
   171  		isfalse(y == z)
   172  
   173  		isfalse(y == x)
   174  		istrue(z == x)
   175  		isfalse(z == y)
   176  
   177  		istrue(x != y)
   178  		isfalse(x != z)
   179  		istrue(y != z)
   180  
   181  		istrue(y != x)
   182  		isfalse(z != x)
   183  		istrue(z != y)
   184  	}
   185  
   186  	// structs
   187  	{
   188  		var x = struct {
   189  			x int
   190  			y string
   191  		}{1, "hi"}
   192  		var y = struct {
   193  			x int
   194  			y string
   195  		}{2, "bye"}
   196  		var z = struct {
   197  			x int
   198  			y string
   199  		}{1, "hi"}
   200  
   201  		isfalse(x == y)
   202  		isfalse(y == x)
   203  		isfalse(y == z)
   204  		isfalse(z == y)
   205  		istrue(x == z)
   206  		istrue(z == x)
   207  
   208  		istrue(x != y)
   209  		istrue(y != x)
   210  		istrue(y != z)
   211  		istrue(z != y)
   212  		isfalse(x != z)
   213  		isfalse(z != x)
   214  
   215  		var m = make(map[struct {
   216  			x int
   217  			y string
   218  		}]int)
   219  		m[x] = 10
   220  		m[y] = 20
   221  		m[z] = 30
   222  		istrue(m[x] == 30)
   223  		istrue(m[y] == 20)
   224  		istrue(m[z] == 30)
   225  		istrue(m[x] != 10)
   226  		isfalse(m[x] != 30)
   227  		isfalse(m[y] != 20)
   228  		isfalse(m[z] != 30)
   229  		isfalse(m[x] == 10)
   230  
   231  		var m1 = make(map[struct {
   232  			x int
   233  			y string
   234  		}]struct {
   235  			x int
   236  			y string
   237  		})
   238  		m1[x] = x
   239  		m1[y] = y
   240  		m1[z] = z
   241  		istrue(m1[x] == z)
   242  		istrue(m1[y] == y)
   243  		istrue(m1[z] == z)
   244  		istrue(m1[x] == x)
   245  		isfalse(m1[x] != z)
   246  		isfalse(m1[y] != y)
   247  		isfalse(m1[z] != z)
   248  		isfalse(m1[x] != x)
   249  
   250  		var ix, iy, iz interface{} = x, y, z
   251  
   252  		isfalse(ix == iy)
   253  		isfalse(iy == ix)
   254  		isfalse(iy == iz)
   255  		isfalse(iz == iy)
   256  		istrue(ix == iz)
   257  		istrue(iz == ix)
   258  
   259  		isfalse(x == iy)
   260  		isfalse(y == ix)
   261  		isfalse(y == iz)
   262  		isfalse(z == iy)
   263  		istrue(x == iz)
   264  		istrue(z == ix)
   265  
   266  		isfalse(ix == y)
   267  		isfalse(iy == x)
   268  		isfalse(iy == z)
   269  		isfalse(iz == y)
   270  		istrue(ix == z)
   271  		istrue(iz == x)
   272  
   273  		istrue(ix != iy)
   274  		istrue(iy != ix)
   275  		istrue(iy != iz)
   276  		istrue(iz != iy)
   277  		isfalse(ix != iz)
   278  		isfalse(iz != ix)
   279  
   280  		istrue(x != iy)
   281  		istrue(y != ix)
   282  		istrue(y != iz)
   283  		istrue(z != iy)
   284  		isfalse(x != iz)
   285  		isfalse(z != ix)
   286  
   287  		istrue(ix != y)
   288  		istrue(iy != x)
   289  		istrue(iy != z)
   290  		istrue(iz != y)
   291  		isfalse(ix != z)
   292  		isfalse(iz != x)
   293  	}
   294  
   295  	// structs with _ fields
   296  	{
   297  		var x = struct {
   298  			x int
   299  			_ string
   300  			y float64
   301  			_ float64
   302  			z int
   303  		}{
   304  			x: 1, y: 2, z: 3,
   305  		}
   306  		var ix interface{} = x
   307  
   308  		istrue(x == x)
   309  		istrue(x == ix)
   310  		istrue(ix == x)
   311  		istrue(ix == ix)
   312  	}
   313  
   314  	// arrays
   315  	{
   316  		var x = [2]string{"1", "hi"}
   317  		var y = [2]string{"2", "bye"}
   318  		var z = [2]string{"1", "hi"}
   319  
   320  		isfalse(x == y)
   321  		isfalse(y == x)
   322  		isfalse(y == z)
   323  		isfalse(z == y)
   324  		istrue(x == z)
   325  		istrue(z == x)
   326  
   327  		istrue(x != y)
   328  		istrue(y != x)
   329  		istrue(y != z)
   330  		istrue(z != y)
   331  		isfalse(x != z)
   332  		isfalse(z != x)
   333  
   334  		var m = make(map[[2]string]int)
   335  		m[x] = 10
   336  		m[y] = 20
   337  		m[z] = 30
   338  		istrue(m[x] == 30)
   339  		istrue(m[y] == 20)
   340  		istrue(m[z] == 30)
   341  		isfalse(m[x] != 30)
   342  		isfalse(m[y] != 20)
   343  		isfalse(m[z] != 30)
   344  
   345  		var ix, iy, iz interface{} = x, y, z
   346  
   347  		isfalse(ix == iy)
   348  		isfalse(iy == ix)
   349  		isfalse(iy == iz)
   350  		isfalse(iz == iy)
   351  		istrue(ix == iz)
   352  		istrue(iz == ix)
   353  
   354  		isfalse(x == iy)
   355  		isfalse(y == ix)
   356  		isfalse(y == iz)
   357  		isfalse(z == iy)
   358  		istrue(x == iz)
   359  		istrue(z == ix)
   360  
   361  		isfalse(ix == y)
   362  		isfalse(iy == x)
   363  		isfalse(iy == z)
   364  		isfalse(iz == y)
   365  		istrue(ix == z)
   366  		istrue(iz == x)
   367  
   368  		istrue(ix != iy)
   369  		istrue(iy != ix)
   370  		istrue(iy != iz)
   371  		istrue(iz != iy)
   372  		isfalse(ix != iz)
   373  		isfalse(iz != ix)
   374  
   375  		istrue(x != iy)
   376  		istrue(y != ix)
   377  		istrue(y != iz)
   378  		istrue(z != iy)
   379  		isfalse(x != iz)
   380  		isfalse(z != ix)
   381  
   382  		istrue(ix != y)
   383  		istrue(iy != x)
   384  		istrue(iy != z)
   385  		istrue(iz != y)
   386  		isfalse(ix != z)
   387  		isfalse(iz != x)
   388  	}
   389  
   390  	shouldPanic(p1)
   391  	shouldPanic(p2)
   392  	shouldPanic(p3)
   393  	shouldPanic(p4)
   394  }
   395  
   396  func p1() {
   397  	var a []int
   398  	var ia interface{} = a
   399  	use(ia == ia)
   400  }
   401  
   402  func p2() {
   403  	var b []int
   404  	var ib interface{} = b
   405  	use(ib == ib)
   406  }
   407  
   408  func p3() {
   409  	var a []int
   410  	var ia interface{} = a
   411  	var m = make(map[interface{}]int)
   412  	m[ia] = 1
   413  }
   414  
   415  func p4() {
   416  	var b []int
   417  	var ib interface{} = b
   418  	var m = make(map[interface{}]int)
   419  	m[ib] = 1
   420  }
   421  
   422  func shouldPanic(f func()) {
   423  	defer func() {
   424  		if recover() == nil {
   425  			panic("function should panic")
   426  		}
   427  	}()
   428  	f()
   429  }