2012-02-16 21:50:37 -07:00
|
|
|
// run
|
2009-03-31 18:33:04 -06: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-18 23:33:41 -07:00
|
|
|
// Test interface comparisons using types hidden
|
2009-05-12 17:09:47 -06:00
|
|
|
// inside reflected-on structs.
|
|
|
|
|
2009-03-31 18:33:04 -06:00
|
|
|
package main
|
|
|
|
|
|
|
|
import "reflect"
|
|
|
|
|
|
|
|
type T struct {
|
2011-10-17 16:48:45 -06:00
|
|
|
F float32
|
|
|
|
G float32
|
2009-03-31 18:33:04 -06:00
|
|
|
|
2011-10-17 16:48:45 -06:00
|
|
|
S string
|
|
|
|
T string
|
2009-03-31 18:33:04 -06:00
|
|
|
|
2011-10-17 16:48:45 -06:00
|
|
|
U uint32
|
|
|
|
V uint32
|
2009-03-31 18:33:04 -06:00
|
|
|
|
2011-10-17 16:48:45 -06:00
|
|
|
W uint32
|
|
|
|
X uint32
|
2009-03-31 18:33:04 -06:00
|
|
|
|
2011-10-17 16:48:45 -06:00
|
|
|
Y uint32
|
|
|
|
Z uint32
|
2009-03-31 18:33:04 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func add(s, t string) string {
|
2010-09-03 18:36:13 -06:00
|
|
|
return s + t
|
2009-03-31 18:33:04 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func assert(b bool) {
|
|
|
|
if !b {
|
2010-09-03 18:36:13 -06:00
|
|
|
panic("assert")
|
2009-03-31 18:33:04 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
2010-09-03 18:36:13 -06:00
|
|
|
var x T
|
2011-10-17 16:48:45 -06: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 18:33:04 -06:00
|
|
|
|
|
|
|
// check mem and string
|
2011-04-25 11:39:36 -06:00
|
|
|
v := reflect.ValueOf(x)
|
2011-04-08 10:27:58 -06:00
|
|
|
i := v.Field(0)
|
|
|
|
j := v.Field(1)
|
2010-09-03 18:36:13 -06:00
|
|
|
assert(i.Interface() == j.Interface())
|
2009-03-31 18:33:04 -06:00
|
|
|
|
2011-04-08 10:27:58 -06:00
|
|
|
s := v.Field(2)
|
|
|
|
t := v.Field(3)
|
2010-09-03 18:36:13 -06:00
|
|
|
assert(s.Interface() == t.Interface())
|
2009-03-31 18:33:04 -06:00
|
|
|
|
|
|
|
// make sure different values are different.
|
|
|
|
// make sure whole word is being compared,
|
|
|
|
// not just a single byte.
|
2011-04-08 10:27:58 -06:00
|
|
|
i = v.Field(4)
|
|
|
|
j = v.Field(5)
|
2010-09-03 18:36:13 -06:00
|
|
|
assert(i.Interface() != j.Interface())
|
2009-03-31 18:33:04 -06:00
|
|
|
|
2011-04-08 10:27:58 -06:00
|
|
|
i = v.Field(6)
|
|
|
|
j = v.Field(7)
|
2010-09-03 18:36:13 -06:00
|
|
|
assert(i.Interface() != j.Interface())
|
2009-03-31 18:33:04 -06:00
|
|
|
|
2011-04-08 10:27:58 -06:00
|
|
|
i = v.Field(8)
|
|
|
|
j = v.Field(9)
|
2010-09-03 18:36:13 -06:00
|
|
|
assert(i.Interface() == j.Interface())
|
2009-03-31 18:33:04 -06: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()
|
|
|
|
*/
|