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

package	main

func
setpd(a []int)
{
//	print("setpd a=", a, " len=", len(a), " cap=", cap(a), "\n");
	for i:=0; i<len(a); i++ {
		a[i] = i;
	}
}

func
sumpd(a []int) int
{
//	print("sumpd a=", a, " len=", len(a), " cap=", cap(a), "\n");
	t := 0;
	for i:=0; i<len(a); i++ {
		t += a[i];
	}
//	print("sumpd t=", t, "\n");
	return t;
}

func
setpf(a *[20]int)
{
//	print("setpf a=", a, " len=", len(a), " cap=", cap(a), "\n");
	for i:=0; i<len(a); i++ {
		a[i] = i;
	}
}

func
sumpf(a *[20]int) int
{
//	print("sumpf a=", a, " len=", len(a), " cap=", cap(a), "\n");
	t := 0;
	for i:=0; i<len(a); i++ {
		t += a[i];
	}
//	print("sumpf t=", t, "\n");
	return t;
}

func
res(t int, lb, hb int)
{
	sb := (hb-lb)*(hb+lb-1)/2;
	if t != sb {
		print(	"lb=", lb,
			"; hb=", hb,
			"; t=", t,
			"; sb=", sb,
			"\n");
		panic("res")
	}
}

// call ptr dynamic with ptr dynamic
func
testpdpd()
{
	a := make([]int, 10, 100);
	if len(a) != 10 && cap(a) != 100 {
		panic("len and cap from new: ", len(a), " ", cap(a), "\n");
	}

	a = a[0:100];
	setpd(a);

	a = a[0:10];
	res(sumpd(a), 0, 10);

	a = a[5:25];
	res(sumpd(a), 5, 25);
}

// call ptr fixed with ptr fixed
func
testpfpf()
{
	var a [20]int;

	setpf(&a);
	res(sumpf(&a), 0, 20);
}

// call ptr dynamic with ptr fixed from new
func
testpdpf1()
{
	a := new([40]int);
	setpd(a);
	res(sumpd(a), 0, 40);

	b := (*a)[5:30];
	res(sumpd(b), 5, 30);
}

// call ptr dynamic with ptr fixed from var
func
testpdpf2()
{
	var a [80]int;

	setpd(&a);
	res(sumpd(&a), 0, 80);
}

// generate bounds error with ptr dynamic
func
testpdfault()
{
	a := make([]int, 100);

	print("good\n");
	for i:=0; i<100; i++ {
		a[i] = 0;
	}
	print("should fault\n");
	a[100] = 0;
	print("bad\n");
}

// generate bounds error with ptr fixed
func
testfdfault()
{
	var a [80]int;

	print("good\n");
	for i:=0; i<80; i++ {
		a[i] = 0;
	}
	print("should fault\n");
	x := 80;
	a[x] = 0;
	print("bad\n");
}

func
main()
{
	testpdpd();
	testpfpf();
	testpdpf1();
	testpdpf2();
//	print("testpdfault\n");	testpdfault();
//	print("testfdfault\n");	testfdfault();
}
