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