| 
									
										
										
										
											2012-02-16 23:50:37 -05:00
										 |  |  | // run | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | // 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-19 17:33:41 +11:00
										 |  |  | // Test interface comparisons using types hidden | 
					
						
							| 
									
										
										
										
											2009-05-12 16:09:47 -07:00
										 |  |  | // inside reflected-on structs. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import "reflect" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type T struct { | 
					
						
							| 
									
										
										
										
											2011-10-17 18:48:45 -04:00
										 |  |  | 	F float32 | 
					
						
							|  |  |  | 	G float32 | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-17 18:48:45 -04:00
										 |  |  | 	S string | 
					
						
							|  |  |  | 	T string | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-17 18:48:45 -04:00
										 |  |  | 	U uint32 | 
					
						
							|  |  |  | 	V uint32 | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-17 18:48:45 -04:00
										 |  |  | 	W uint32 | 
					
						
							|  |  |  | 	X uint32 | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-17 18:48:45 -04:00
										 |  |  | 	Y uint32 | 
					
						
							|  |  |  | 	Z uint32 | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func add(s, t string) string { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	return s + t | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func assert(b bool) { | 
					
						
							|  |  |  | 	if !b { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 		panic("assert") | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	var x T | 
					
						
							| 
									
										
										
										
											2011-10-17 18:48:45 -04:00
										 |  |  | 	x.F = 1.0 | 
					
						
							|  |  |  | 	x.G = x.F | 
					
						
							|  |  |  | 	x.S = add("abc", "def") | 
					
						
							|  |  |  | 	x.T = add("abc", "def") | 
					
						
							|  |  |  | 	x.U = 1 | 
					
						
							|  |  |  | 	x.V = 2 | 
					
						
							|  |  |  | 	x.W = 1 << 28 | 
					
						
							|  |  |  | 	x.X = 2 << 28 | 
					
						
							|  |  |  | 	x.Y = 0x12345678 | 
					
						
							|  |  |  | 	x.Z = x.Y | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// check mem and string | 
					
						
							| 
									
										
										
										
											2011-04-25 13:39:36 -04:00
										 |  |  | 	v := reflect.ValueOf(x) | 
					
						
							| 
									
										
										
										
											2011-04-08 12:27:58 -04:00
										 |  |  | 	i := v.Field(0) | 
					
						
							|  |  |  | 	j := v.Field(1) | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	assert(i.Interface() == j.Interface()) | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 12:27:58 -04:00
										 |  |  | 	s := v.Field(2) | 
					
						
							|  |  |  | 	t := v.Field(3) | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	assert(s.Interface() == t.Interface()) | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// make sure different values are different. | 
					
						
							|  |  |  | 	// make sure whole word is being compared, | 
					
						
							|  |  |  | 	// not just a single byte. | 
					
						
							| 
									
										
										
										
											2011-04-08 12:27:58 -04:00
										 |  |  | 	i = v.Field(4) | 
					
						
							|  |  |  | 	j = v.Field(5) | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	assert(i.Interface() != j.Interface()) | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 12:27:58 -04:00
										 |  |  | 	i = v.Field(6) | 
					
						
							|  |  |  | 	j = v.Field(7) | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	assert(i.Interface() != j.Interface()) | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 12:27:58 -04:00
										 |  |  | 	i = v.Field(8) | 
					
						
							|  |  |  | 	j = v.Field(9) | 
					
						
							| 
									
										
										
										
											2010-09-04 10:36:13 +10:00
										 |  |  | 	assert(i.Interface() == j.Interface()) | 
					
						
							| 
									
										
										
										
											2009-03-31 17:33:04 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | comparing uncomparable type float32 | 
					
						
							|  |  |  | throw: interface compare | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | panic PC=0x28ceb8 [1] | 
					
						
							|  |  |  | throw+0x41 /Users/rsc/goX/src/runtime/runtime.c:54 | 
					
						
							|  |  |  | 	throw(0x3014a, 0x0) | 
					
						
							|  |  |  | ifaceeq+0x15c /Users/rsc/goX/src/runtime/iface.c:501 | 
					
						
							|  |  |  | 	ifaceeq(0x2aa7c0, 0x0, 0x0, 0x0, 0x2aa7c0, ...) | 
					
						
							|  |  |  | sys·ifaceeq+0x48 /Users/rsc/goX/src/runtime/iface.c:527 | 
					
						
							|  |  |  | 	sys·ifaceeq(0x2aa7c0, 0x0, 0x0, 0x0, 0x2aa7c0, ...) | 
					
						
							|  |  |  | main·main+0x190 /Users/rsc/goX/src/cmd/gc/x.go:10 | 
					
						
							|  |  |  | 	main·main() | 
					
						
							|  |  |  | mainstart+0xf /Users/rsc/goX/src/runtime/amd64/asm.s:53 | 
					
						
							|  |  |  | 	mainstart() | 
					
						
							|  |  |  | sys·Goexit /Users/rsc/goX/src/runtime/proc.c:124 | 
					
						
							|  |  |  | 	sys·Goexit() | 
					
						
							|  |  |  | */ |