// $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.Field(0)
	j := v.Field(1)
	assert(i.Interface() == j.Interface())

	s := v.Field(2)
	t := v.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.Field(4)
	j = v.Field(5)
	assert(i.Interface() != j.Interface())

	i = v.Field(6)
	j = v.Field(7)
	assert(i.Interface() != j.Interface())

	i = v.Field(8)
	j = v.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()
*/
