github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/fixedbugs/issue4085b.go (about)

     1  // run
     2  
     3  // Copyright 2013 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  package main
     8  
     9  import (
    10  	"strings"
    11  	"unsafe"
    12  )
    13  
    14  type T []int
    15  
    16  func main() {
    17  	n := -1
    18  	shouldPanic("len out of range", func() {_ = make(T, n)})
    19  	shouldPanic("cap out of range", func() {_ = make(T, 0, n)})
    20  	var t *byte
    21  	if unsafe.Sizeof(t) == 8 {
    22  		n = 1<<20
    23  		n <<= 20
    24  		shouldPanic("len out of range", func() {_ = make(T, n)})
    25  		shouldPanic("cap out of range", func() {_ = make(T, 0, n)})
    26  		n <<= 20
    27  		shouldPanic("len out of range", func() {_ = make(T, n)})
    28  		shouldPanic("cap out of range", func() {_ = make(T, 0, n)})
    29  	} else {
    30  		n = 1<<31 - 1
    31  		shouldPanic("len out of range", func() {_ = make(T, n)})
    32  		shouldPanic("cap out of range", func() {_ = make(T, 0, n)})
    33  	}
    34  }
    35  
    36  func shouldPanic(str string, f func()) {
    37  	defer func() {
    38  		err := recover()
    39  		if err == nil {
    40  			panic("did not panic")
    41  		}
    42  		s := err.(error).Error()
    43  		if !strings.Contains(s, str) {
    44  			panic("got panic " + s + ", want " + str)
    45  		}
    46  	}()
    47  	
    48  	f()
    49  }