// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG interface6

// 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 values containing structures.

package main

import "os"

var fail int

func check(b bool, msg string) {
	if (!b) {
		println("failure in", msg);
		fail++;
	}
}

type I1 interface { Get() int; Put(int); }

type S1 struct { i int }
func (p S1) Get() int { return p.i }
func (p S1) Put(i int) { p.i = i }

func f1() {
	s := S1{1};
	var i I1 = s;
	i.Put(2);
	check(i.Get() == 1, "f1 i");
	check(s.i == 1, "f1 s");
}

func f2() {
	s := S1{1};
	var i I1 = &s;
	i.Put(2);
	check(i.Get() == 1, "f2 i");
	check(s.i == 1, "f2 s");
}

func f3() {
	s := &S1{1};
	var i I1 = s;
	i.Put(2);
	check(i.Get() == 1, "f3 i");
	check(s.i == 1, "f3 s");
}

type S2 struct { i int }
func (p *S2) Get() int { return p.i }
func (p *S2) Put(i int) { p.i = i }

// Disallowed by restriction of values going to pointer receivers
// func f4() {
//	 s := S2{1};
//	 var i I1 = s;
//	 i.Put(2);
//	 check(i.Get() == 2, "f4 i");
//	 check(s.i == 1, "f4 s");
// }

func f5() {
	s := S2{1};
	var i I1 = &s;
	i.Put(2);
	check(i.Get() == 2, "f5 i");
	check(s.i == 2, "f5 s");
}

func f6() {
	s := &S2{1};
	var i I1 = s;
	i.Put(2);
	check(i.Get() == 2, "f6 i");
	check(s.i == 2, "f6 s");
}

type I2 interface { Get() int64; Put(int64); }

type S3 struct { i, j, k, l int64 }
func (p S3) Get() int64 { return p.l }
func (p S3) Put(i int64) { p.l = i }

func f7() {
	s := S3{1, 2, 3, 4};
	var i I2 = s;
	i.Put(5);
	check(i.Get() == 4, "f7 i");
	check(s.l == 4, "f7 s");
}

func f8() {
	s := S3{1, 2, 3, 4};
	var i I2 = &s;
	i.Put(5);
	check(i.Get() == 4, "f8 i");
	check(s.l == 4, "f8 s");
}

func f9() {
	s := &S3{1, 2, 3, 4};
	var i I2 = s;
	i.Put(5);
	check(i.Get() == 4, "f9 i");
	check(s.l == 4, "f9 s");
}

type S4 struct { i, j, k, l int64 }
func (p *S4) Get() int64 { return p.l }
func (p *S4) Put(i int64) { p.l = i }

// Disallowed by restriction of values going to pointer receivers
// func f10() {
//	 s := S4{1, 2, 3, 4};
//	 var i I2 = s;
//	 i.Put(5);
//	 check(i.Get() == 5, "f10 i");
//	 check(s.l == 4, "f10 s");
// }

func f11() {
	s := S4{1, 2, 3, 4};
	var i I2 = &s;
	i.Put(5);
	check(i.Get() == 5, "f11 i");
	check(s.l == 5, "f11 s");
}

func f12() {
	s := &S4{1, 2, 3, 4};
	var i I2 = s;
	i.Put(5);
	check(i.Get() == 5, "f12 i");
	check(s.l == 5, "f12 s");
}

func main() {
	f1();
	f2();
	f3();
//	f4();
	f5();
	f6();
	f7();
	f8();
	f9();
//	f10();
	f11();
	f12();
	if fail > 0 {
		os.Exit(1)
	}
}
