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