blob: 687b3ff0cb90b27e829da695e3f5e2f19240dbca [file] [log] [blame]
// $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.
// Interface comparisons using types hidden
// inside reflected-on structs.
package main
import "reflect"
type T struct {
f float32;
g float32;
s string;
t string;
u uint32;
v uint32;
w uint32;
x uint32;
y uint32;
z uint32;
}
func add(s, t string) string {
return s + t;
}
func assert(b bool) {
if !b {
panic("assert");
}
}
func main() {
var x T;
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;
// check mem and string
v := reflect.NewValue(x);
i := v.(*reflect.StructValue).Field(0);
j := v.(*reflect.StructValue).Field(1);
assert(i.Interface() == j.Interface());
s := v.(*reflect.StructValue).Field(2);
t := v.(*reflect.StructValue).Field(3);
assert(s.Interface() == t.Interface());
// make sure different values are different.
// make sure whole word is being compared,
// not just a single byte.
i = v.(*reflect.StructValue).Field(4);
j = v.(*reflect.StructValue).Field(5);
assert(i.Interface() != j.Interface());
i = v.(*reflect.StructValue).Field(6);
j = v.(*reflect.StructValue).Field(7);
assert(i.Interface() != j.Interface());
i = v.(*reflect.StructValue).Field(8);
j = v.(*reflect.StructValue).Field(9);
assert(i.Interface() == j.Interface());
}
/*
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()
*/