| // run | 
 |  | 
 | // Copyright 2020 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. | 
 |  | 
 | // Make sure runtime.panicmakeslice* are called. | 
 |  | 
 | package main | 
 |  | 
 | import "strings" | 
 |  | 
 | func main() { | 
 | 	// Test typechecking passes if len is valid | 
 | 	// but cap is out of range for len's type. | 
 | 	var x byte | 
 | 	_ = make([]int, x, 300) | 
 |  | 
 | 	capOutOfRange := func() { | 
 | 		i := 2 | 
 | 		s := make([]int, i, 1) | 
 | 		s[0] = 1 | 
 | 	} | 
 | 	lenOutOfRange := func() { | 
 | 		i := -1 | 
 | 		s := make([]int, i, 3) | 
 | 		s[0] = 1 | 
 | 	} | 
 |  | 
 | 	tests := []struct { | 
 | 		f        func() | 
 | 		panicStr string | 
 | 	}{ | 
 | 		{capOutOfRange, "cap out of range"}, | 
 | 		{lenOutOfRange, "len out of range"}, | 
 | 	} | 
 |  | 
 | 	for _, tc := range tests { | 
 | 		shouldPanic(tc.panicStr, tc.f) | 
 | 	} | 
 |  | 
 | } | 
 |  | 
 | func shouldPanic(str string, f func()) { | 
 | 	defer func() { | 
 | 		err := recover() | 
 | 		runtimeErr := err.(error).Error() | 
 | 		if !strings.Contains(runtimeErr, str) { | 
 | 			panic("got panic " + runtimeErr + ", want " + str) | 
 | 		} | 
 | 	}() | 
 |  | 
 | 	f() | 
 | } |