// $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()
*/
