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