1
0
mirror of https://github.com/golang/go synced 2024-11-22 16:14:56 -07:00
go/test/ken/array.go
Rob Pike 3489fe958e compiler catches out of bounds; work around
R=ken
OCL=19943
CL=19943
2008-11-24 16:23:49 -08:00

157 lines
2.2 KiB
Go

// $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
export 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;
}
}
export 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;
}
export 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;
}
}
export 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 := new([]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 := new([]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();
}