|  | // $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"); | 
|  | a[80] = 0; | 
|  | print("bad\n"); | 
|  | } | 
|  |  | 
|  | func | 
|  | main() | 
|  | { | 
|  | testpdpd(); | 
|  | testpfpf(); | 
|  | testpdpf1(); | 
|  | testpdpf2(); | 
|  | //	print("testpdfault\n");	testpdfault(); | 
|  | //	print("testfdfault\n");	testfdfault(); | 
|  | } |