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