modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/ken/array.go (about)

     1  // run
     2  
     3  // Copyright 2009 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test arrays and slices.
     8  
     9  package main
    10  
    11  func setpd(a []int) {
    12  	//	print("setpd a=", a, " len=", len(a), " cap=", cap(a), "\n");
    13  	for i := 0; i < len(a); i++ {
    14  		a[i] = i
    15  	}
    16  }
    17  
    18  func sumpd(a []int) int {
    19  	//	print("sumpd a=", a, " len=", len(a), " cap=", cap(a), "\n");
    20  	t := 0
    21  	for i := 0; i < len(a); i++ {
    22  		t += a[i]
    23  	}
    24  	//	print("sumpd t=", t, "\n");
    25  	return t
    26  }
    27  
    28  func setpf(a *[20]int) {
    29  	//	print("setpf a=", a, " len=", len(a), " cap=", cap(a), "\n");
    30  	for i := 0; i < len(a); i++ {
    31  		a[i] = i
    32  	}
    33  }
    34  
    35  func sumpf(a *[20]int) int {
    36  	//	print("sumpf a=", a, " len=", len(a), " cap=", cap(a), "\n");
    37  	t := 0
    38  	for i := 0; i < len(a); i++ {
    39  		t += a[i]
    40  	}
    41  	//	print("sumpf t=", t, "\n");
    42  	return t
    43  }
    44  
    45  func res(t int, lb, hb int) {
    46  	sb := (hb - lb) * (hb + lb - 1) / 2
    47  	if t != sb {
    48  		print("lb=", lb,
    49  			"; hb=", hb,
    50  			"; t=", t,
    51  			"; sb=", sb,
    52  			"\n")
    53  		panic("res")
    54  	}
    55  }
    56  
    57  // call ptr dynamic with ptr dynamic
    58  func testpdpd() {
    59  	a := make([]int, 10, 100)
    60  	if len(a) != 10 && cap(a) != 100 {
    61  		print("len and cap from new: ", len(a), " ", cap(a), "\n")
    62  		panic("fail")
    63  	}
    64  
    65  	a = a[0:100]
    66  	setpd(a)
    67  
    68  	a = a[0:10]
    69  	res(sumpd(a), 0, 10)
    70  
    71  	a = a[5:25]
    72  	res(sumpd(a), 5, 25)
    73  
    74  	a = a[30:95]
    75  	res(sumpd(a), 35, 100)
    76  }
    77  
    78  // call ptr fixed with ptr fixed
    79  func testpfpf() {
    80  	var a [20]int
    81  
    82  	setpf(&a)
    83  	res(sumpf(&a), 0, 20)
    84  }
    85  
    86  // call ptr dynamic with ptr fixed from new
    87  func testpdpf1() {
    88  	a := new([40]int)
    89  	setpd(a[0:])
    90  	res(sumpd(a[0:]), 0, 40)
    91  
    92  	b := (*a)[5:30]
    93  	res(sumpd(b), 5, 30)
    94  }
    95  
    96  // call ptr dynamic with ptr fixed from var
    97  func testpdpf2() {
    98  	var a [80]int
    99  
   100  	setpd(a[0:])
   101  	res(sumpd(a[0:]), 0, 80)
   102  }
   103  
   104  // generate bounds error with ptr dynamic
   105  func testpdfault() {
   106  	a := make([]int, 100)
   107  
   108  	print("good\n")
   109  	for i := 0; i < 100; i++ {
   110  		a[i] = 0
   111  	}
   112  	print("should fault\n")
   113  	a[100] = 0
   114  	print("bad\n")
   115  }
   116  
   117  // generate bounds error with ptr fixed
   118  func testfdfault() {
   119  	var a [80]int
   120  
   121  	print("good\n")
   122  	for i := 0; i < 80; i++ {
   123  		a[i] = 0
   124  	}
   125  	print("should fault\n")
   126  	x := 80
   127  	a[x] = 0
   128  	print("bad\n")
   129  }
   130  
   131  func main() {
   132  	testpdpd()
   133  	testpfpf()
   134  	testpdpf1()
   135  	testpdpf2()
   136  	//	print("testpdfault\n");	testpdfault();
   137  	//	print("testfdfault\n");	testfdfault();
   138  }