// $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.

// check that big vs small, pointer vs not
// interface methods work.

package main

type I interface { M() int64 }

type BigPtr struct { a, b, c, d int64 }
func (z *BigPtr) M() int64 { return z.a+z.b+z.c+z.d }

type SmallPtr struct { a int32 }
func (z *SmallPtr) M() int64 { return int64(z.a) }

type IntPtr int32
func (z *IntPtr) M() int64 { return int64(*z) }

var bad bool

func test(name string, i I) {
	m := i.M();
	if m != 12345 {
		println(name, m);
		bad = true;
	}
}

func ptrs() {
	var bigptr BigPtr = BigPtr{ 10000, 2000, 300, 45 };
	var smallptr SmallPtr = SmallPtr{ 12345 };
	var intptr IntPtr = 12345;

//	test("bigptr", bigptr);
	test("&bigptr", &bigptr);
//	test("smallptr", smallptr);
	test("&smallptr", &smallptr);
//	test("intptr", intptr);
	test("&intptr", &intptr);
}

type Big struct { a, b, c, d int64 }
func (z Big) M() int64 { return z.a+z.b+z.c+z.d }

type Small struct { a int32 }
func (z Small) M() int64 { return int64(z.a) }

type Int int32
func (z Int) M() int64 { return int64(z) }

func nonptrs() {
	var big Big = Big{ 10000, 2000, 300, 45 };
	var small Small = Small{ 12345 };
	var int Int = 12345;

	test("big", big);
	test("&big", &big);
	test("small", small);
	test("&small", &small);
	test("int", int);
	test("&int", &int);
}

func main() {
	ptrs();
	nonptrs();

	if bad {
		println("BUG: interface4");
	}
}
