| // run | 
 |  | 
 | // 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. | 
 |  | 
 | // Test arrays and slices. | 
 |  | 
 | 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 { | 
 | 		print("len and cap from new: ", len(a), " ", cap(a), "\n") | 
 | 		panic("fail") | 
 | 	} | 
 |  | 
 | 	a = a[0:100] | 
 | 	setpd(a) | 
 |  | 
 | 	a = a[0:10] | 
 | 	res(sumpd(a), 0, 10) | 
 |  | 
 | 	a = a[5:25] | 
 | 	res(sumpd(a), 5, 25) | 
 |  | 
 | 	a = a[30:95] | 
 | 	res(sumpd(a), 35, 100) | 
 | } | 
 |  | 
 | // 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[0:]) | 
 | 	res(sumpd(a[0:]), 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[0:]) | 
 | 	res(sumpd(a[0:]), 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(); | 
 | } |