// run // Copyright 2019 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. // This test makes sure the text output for bounds check failures is as expected. package main import ( "fmt" "os" "runtime" "text/tabwriter" ) // Testing with length 3 slices, arrays, and strings. // Large (>1<<32) values are included to test 32-bit platforms. var indexes = []int64{-9876543210, -1, 0, 2, 3, 9876543210} var slices = []int64{-9876543210, -1, 0, 3, 4, 9876543210} var w *tabwriter.Writer func main() { w = tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.AlignRight) defer w.Flush() doIndex() doSlice() doSlice3() } func doIndex() { a := []int{1, 2, 3} for _, i := range indexes { printPanic(fmt.Sprintf("slice[%d]", i), func() { _ = a[i] }) } b := [3]int{1, 2, 3} for _, i := range indexes { printPanic(fmt.Sprintf("array[%d]", i), func() { _ = b[i] }) } c := "123" for _, i := range indexes { printPanic(fmt.Sprintf("string[%d]", i), func() { _ = c[i] }) } } func doSlice() { a := []int{1, 2, 3} for _, i := range slices { for _, j := range slices { printPanic(fmt.Sprintf("slice[%d:%d]", i, j), func() { _ = a[i:j] }) } } b := [3]int{1, 2, 3} for _, i := range slices { for _, j := range slices { printPanic(fmt.Sprintf("array[%d:%d]", i, j), func() { _ = b[i:j] }) } } c := "123" for _, i := range slices { for _, j := range slices { printPanic(fmt.Sprintf("string[%d:%d]", i, j), func() { _ = c[i:j] }) } } } func doSlice3() { a := []int{1, 2, 3} for _, i := range slices { for _, j := range slices { for _, k := range slices { printPanic(fmt.Sprintf("slice[%d:%d:%d]", i, j, k), func() { _ = a[i:j:k] }) } } } b := [3]int{1, 2, 3} for _, i := range slices { for _, j := range slices { for _, k := range slices { printPanic(fmt.Sprintf("array[%d:%d:%d]", i, j, k), func() { _ = b[i:j:k] }) } } } } func printPanic(msg string, f func()) { defer func() { res := "no panic" if e := recover(); e != nil { res = e.(runtime.Error).Error() } fmt.Fprintf(w, "%s\t %s\n", msg, res) }() f() }