1// run 2 3// Copyright 2009 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// Test the cap predeclared function applied to channels. 8 9package main 10 11import ( 12 "strings" 13 "unsafe" 14) 15 16type T chan int 17 18const ptrSize = unsafe.Sizeof((*byte)(nil)) 19 20func main() { 21 c := make(T, 10) 22 if len(c) != 0 || cap(c) != 10 { 23 println("chan len/cap ", len(c), cap(c), " want 0 10") 24 panic("fail") 25 } 26 27 for i := 0; i < 3; i++ { 28 c <- i 29 } 30 if len(c) != 3 || cap(c) != 10 { 31 println("chan len/cap ", len(c), cap(c), " want 3 10") 32 panic("fail") 33 } 34 35 c = make(T) 36 if len(c) != 0 || cap(c) != 0 { 37 println("chan len/cap ", len(c), cap(c), " want 0 0") 38 panic("fail") 39 } 40 41 n := -1 42 shouldPanic("makechan: size out of range", func() { _ = make(T, n) }) 43 shouldPanic("makechan: size out of range", func() { _ = make(T, int64(n)) }) 44 if ptrSize == 8 { 45 // Test mem > maxAlloc 46 var n2 int64 = 1 << 59 47 shouldPanic("makechan: size out of range", func() { _ = make(T, int(n2)) }) 48 // Test elem.size*cap overflow 49 n2 = 1<<63 - 1 50 shouldPanic("makechan: size out of range", func() { _ = make(T, int(n2)) }) 51 } else { 52 n = 1<<31 - 1 53 shouldPanic("makechan: size out of range", func() { _ = make(T, n) }) 54 shouldPanic("makechan: size out of range", func() { _ = make(T, int64(n)) }) 55 } 56} 57 58func shouldPanic(str string, f func()) { 59 defer func() { 60 err := recover() 61 if err == nil { 62 panic("did not panic") 63 } 64 s := err.(error).Error() 65 if !strings.Contains(s, str) { 66 panic("got panic " + s + ", want " + str) 67 } 68 }() 69 70 f() 71} 72