| // run | |
| // Copyright 2010 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. | |
| // http://code.google.com/p/go/issues/detail?id=589 | |
| package main | |
| import "unsafe" | |
| var bug = false | |
| var minus1 = -1 | |
| var big int64 = 10 | 1<<32 | |
| var g1 []int | |
| func shouldfail(f func(), desc string) { | |
| defer func() { recover() }() | |
| f() | |
| if !bug { | |
| println("BUG") | |
| bug = true | |
| } | |
| println("didn't crash: ", desc) | |
| } | |
| func badlen() { | |
| g1 = make([]int, minus1) | |
| } | |
| func biglen() { | |
| g1 = make([]int, big) | |
| } | |
| func badcap() { | |
| g1 = make([]int, 10, minus1) | |
| } | |
| func badcap1() { | |
| g1 = make([]int, 10, 5) | |
| } | |
| func bigcap() { | |
| g1 = make([]int, 10, big) | |
| } | |
| var g3 map[int]int | |
| func badmapcap() { | |
| g3 = make(map[int]int, minus1) | |
| } | |
| func bigmapcap() { | |
| g3 = make(map[int]int, big) | |
| } | |
| var g4 chan int | |
| func badchancap() { | |
| g4 = make(chan int, minus1) | |
| } | |
| func bigchancap() { | |
| g4 = make(chan int, big) | |
| } | |
| const addrBits = unsafe.Sizeof((*byte)(nil)) | |
| var g5 chan [1<<15]byte | |
| func overflowchan() { | |
| if addrBits == 32 { | |
| g5 = make(chan [1<<15]byte, 1<<20) | |
| } else { | |
| // cannot overflow on 64-bit, because | |
| // int is 32 bits and max chan value size | |
| // in the implementation is 64 kB. | |
| panic(1) | |
| } | |
| } | |
| func main() { | |
| shouldfail(badlen, "badlen") | |
| shouldfail(biglen, "biglen") | |
| shouldfail(badcap, "badcap") | |
| shouldfail(badcap1, "badcap1") | |
| shouldfail(bigcap, "bigcap") | |
| shouldfail(badmapcap, "badmapcap") | |
| shouldfail(bigmapcap, "bigmapcap") | |
| shouldfail(badchancap, "badchancap") | |
| shouldfail(bigchancap, "bigchancap") | |
| shouldfail(overflowchan, "overflowchan") | |
| } |