| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | // $G $D/$F.go && $L $F.$A && ./$A.out | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Copyright 2009 The Go Authors. All rights reserved. | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style | 
					
						
							|  |  |  | // license that can be found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import "unsafe" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | func use(bool) {} | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | func stringptr(s string) uintptr { return *(*uintptr)(unsafe.Pointer(&s)) } | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func isfalse(b bool) { | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | 	if b { | 
					
						
							|  |  |  | 		// stack will explain where | 
					
						
							|  |  |  | 		panic("wanted false, got true") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func istrue(b bool) { | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | 	if !b { | 
					
						
							|  |  |  | 		// stack will explain where | 
					
						
							|  |  |  | 		panic("wanted true, got false") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-13 15:42:47 -04:00
										 |  |  | type T *int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-09 19:27:08 -08:00
										 |  |  | func main() { | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | 	var a []int | 
					
						
							|  |  |  | 	var b map[string]int | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | 	var c string = "hello" | 
					
						
							|  |  |  | 	var d string = "hel" // try to get different pointer | 
					
						
							|  |  |  | 	d = d + "lo" | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 	if stringptr(c) == stringptr(d) { | 
					
						
							|  |  |  | 		panic("compiler too smart -- got same string") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | 	var e = make(chan int) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var ia interface{} = a | 
					
						
							|  |  |  | 	var ib interface{} = b | 
					
						
							|  |  |  | 	var ic interface{} = c | 
					
						
							|  |  |  | 	var id interface{} = d | 
					
						
							|  |  |  | 	var ie interface{} = e | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// these comparisons are okay because | 
					
						
							|  |  |  | 	// string compare is okay and the others | 
					
						
							|  |  |  | 	// are comparisons where the types differ. | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | 	isfalse(ia == ib) | 
					
						
							|  |  |  | 	isfalse(ia == ic) | 
					
						
							|  |  |  | 	isfalse(ia == id) | 
					
						
							|  |  |  | 	isfalse(ib == ic) | 
					
						
							|  |  |  | 	isfalse(ib == id) | 
					
						
							|  |  |  | 	istrue(ic == id) | 
					
						
							|  |  |  | 	istrue(ie == ie) | 
					
						
							| 
									
										
										
										
											2010-09-13 15:42:47 -04:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	// these are okay because one side of the | 
					
						
							|  |  |  | 	// comparison need only be assignable to the other. | 
					
						
							|  |  |  | 	isfalse(a == ib) | 
					
						
							|  |  |  | 	isfalse(a == ic) | 
					
						
							|  |  |  | 	isfalse(a == id) | 
					
						
							|  |  |  | 	isfalse(b == ic) | 
					
						
							|  |  |  | 	isfalse(b == id) | 
					
						
							|  |  |  | 	istrue(c == id) | 
					
						
							|  |  |  | 	istrue(e == ie) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	isfalse(ia == b) | 
					
						
							|  |  |  | 	isfalse(ia == c) | 
					
						
							|  |  |  | 	isfalse(ia == d) | 
					
						
							|  |  |  | 	isfalse(ib == c) | 
					
						
							|  |  |  | 	isfalse(ib == d) | 
					
						
							|  |  |  | 	istrue(ic == d) | 
					
						
							|  |  |  | 	istrue(ie == e) | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-26 12:36:21 -08:00
										 |  |  | 	// 6g used to let this go through as true. | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | 	var g uint64 = 123 | 
					
						
							|  |  |  | 	var h int64 = 123 | 
					
						
							|  |  |  | 	var ig interface{} = g | 
					
						
							|  |  |  | 	var ih interface{} = h | 
					
						
							|  |  |  | 	isfalse(ig == ih) | 
					
						
							| 
									
										
										
										
											2009-01-26 12:36:21 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 	// map of interface should use == on interface values, | 
					
						
							|  |  |  | 	// not memory. | 
					
						
							|  |  |  | 	// TODO: should m[c], m[d] be valid here? | 
					
						
							| 
									
										
										
										
											2010-03-24 16:46:53 -07:00
										 |  |  | 	var m = make(map[interface{}]int) | 
					
						
							|  |  |  | 	m[ic] = 1 | 
					
						
							|  |  |  | 	m[id] = 2 | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 	if m[ic] != 2 { | 
					
						
							| 
									
										
										
										
											2010-03-30 10:34:57 -07:00
										 |  |  | 		println("m[ic] = ", m[ic]) | 
					
						
							|  |  |  | 		panic("bad m[ic]") | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-09-13 15:42:47 -04:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	// non-interface comparisons | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		c := make(chan int) | 
					
						
							|  |  |  | 		c1 := (<-chan int)(c) | 
					
						
							|  |  |  | 		c2 := (chan<- int)(c) | 
					
						
							|  |  |  | 		istrue(c == c1) | 
					
						
							|  |  |  | 		istrue(c == c2) | 
					
						
							|  |  |  | 		istrue(c1 == c) | 
					
						
							|  |  |  | 		istrue(c2 == c) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		d := make(chan int) | 
					
						
							|  |  |  | 		isfalse(c == d) | 
					
						
							|  |  |  | 		isfalse(d == c) | 
					
						
							|  |  |  | 		isfalse(d == c1) | 
					
						
							|  |  |  | 		isfalse(d == c2) | 
					
						
							|  |  |  | 		isfalse(c1 == d) | 
					
						
							|  |  |  | 		isfalse(c2 == d) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// named types vs not | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		var x = new(int) | 
					
						
							|  |  |  | 		var y T | 
					
						
							|  |  |  | 		var z T = x | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		isfalse(x == y) | 
					
						
							|  |  |  | 		istrue(x == z) | 
					
						
							|  |  |  | 		isfalse(y == z) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		isfalse(y == x) | 
					
						
							|  |  |  | 		istrue(z == x) | 
					
						
							|  |  |  | 		isfalse(z == y) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-26 09:56:42 -08:00
										 |  |  | } |