// run // Copyright 2009 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. // Test the cap predeclared function applied to channels. package main import ( "strings" "unsafe" ) type T chan int const ptrSize = unsafe.Sizeof((*byte)(nil)) func main() { c := make(T, 10) if len(c) != 0 || cap(c) != 10 { println("chan len/cap ", len(c), cap(c), " want 0 10") panic("fail") } for i := 0; i < 3; i++ { c <- i } if len(c) != 3 || cap(c) != 10 { println("chan len/cap ", len(c), cap(c), " want 3 10") panic("fail") } c = make(T) if len(c) != 0 || cap(c) != 0 { println("chan len/cap ", len(c), cap(c), " want 0 0") panic("fail") } n := -1 shouldPanic("makechan: size out of range", func() { _ = make(T, n) }) shouldPanic("makechan: size out of range", func() { _ = make(T, int64(n)) }) if ptrSize == 8 { // Test mem > maxAlloc var n2 int64 = 1 << 59 shouldPanic("makechan: size out of range", func() { _ = make(T, int(n2)) }) // Test elem.size*cap overflow n2 = 1<<63 - 1 shouldPanic("makechan: size out of range", func() { _ = make(T, int(n2)) }) } else { n = 1<<31 - 1 shouldPanic("makechan: size out of range", func() { _ = make(T, n) }) shouldPanic("makechan: size out of range", func() { _ = make(T, int64(n)) }) } } func shouldPanic(str string, f func()) { defer func() { err := recover() if err == nil { panic("did not panic") } s := err.(error).Error() if !strings.Contains(s, str) { panic("got panic " + s + ", want " + str) } }() f() }