1// run 2 3// Copyright 2019 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// This test makes sure the text output for bounds check failures is as expected. 8 9package main 10 11import ( 12 "fmt" 13 "os" 14 "runtime" 15 "text/tabwriter" 16) 17 18// Testing with length 3 slices, arrays, and strings. 19// Large (>1<<32) values are included to test 32-bit platforms. 20var indexes = []int64{-9876543210, -1, 0, 2, 3, 9876543210} 21var slices = []int64{-9876543210, -1, 0, 3, 4, 9876543210} 22 23var w *tabwriter.Writer 24 25func main() { 26 w = tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.AlignRight) 27 defer w.Flush() 28 doIndex() 29 doSlice() 30 doSlice3() 31} 32func doIndex() { 33 a := []int{1, 2, 3} 34 for _, i := range indexes { 35 printPanic(fmt.Sprintf("slice[%d]", i), func() { 36 _ = a[i] 37 }) 38 } 39 b := [3]int{1, 2, 3} 40 for _, i := range indexes { 41 printPanic(fmt.Sprintf("array[%d]", i), func() { 42 _ = b[i] 43 }) 44 } 45 c := "123" 46 for _, i := range indexes { 47 printPanic(fmt.Sprintf("string[%d]", i), func() { 48 _ = c[i] 49 }) 50 } 51} 52 53func doSlice() { 54 a := []int{1, 2, 3} 55 for _, i := range slices { 56 for _, j := range slices { 57 printPanic(fmt.Sprintf("slice[%d:%d]", i, j), func() { 58 _ = a[i:j] 59 }) 60 } 61 } 62 b := [3]int{1, 2, 3} 63 for _, i := range slices { 64 for _, j := range slices { 65 printPanic(fmt.Sprintf("array[%d:%d]", i, j), func() { 66 _ = b[i:j] 67 }) 68 } 69 } 70 c := "123" 71 for _, i := range slices { 72 for _, j := range slices { 73 printPanic(fmt.Sprintf("string[%d:%d]", i, j), func() { 74 _ = c[i:j] 75 }) 76 } 77 } 78} 79 80func doSlice3() { 81 a := []int{1, 2, 3} 82 for _, i := range slices { 83 for _, j := range slices { 84 for _, k := range slices { 85 printPanic(fmt.Sprintf("slice[%d:%d:%d]", i, j, k), func() { 86 _ = a[i:j:k] 87 }) 88 } 89 } 90 } 91 b := [3]int{1, 2, 3} 92 for _, i := range slices { 93 for _, j := range slices { 94 for _, k := range slices { 95 printPanic(fmt.Sprintf("array[%d:%d:%d]", i, j, k), func() { 96 _ = b[i:j:k] 97 }) 98 } 99 } 100 } 101} 102 103func printPanic(msg string, f func()) { 104 defer func() { 105 res := "no panic" 106 if e := recover(); e != nil { 107 res = e.(runtime.Error).Error() 108 } 109 fmt.Fprintf(w, "%s\t %s\n", msg, res) 110 }() 111 f() 112} 113