diff --git a/src/pkg/runtime/chan.c b/src/pkg/runtime/chan.c index 78f67b817c0..efaceebf5a3 100644 --- a/src/pkg/runtime/chan.c +++ b/src/pkg/runtime/chan.c @@ -97,7 +97,7 @@ runtime·makechan_c(Type *elem, int64 hint) int32 n; byte *by; - if(hint < 0 || (int32)hint != hint || hint > ((uintptr)-1) / elem->size) + if(hint < 0 || (int32)hint != hint || (elem->size > 0 && hint > ((uintptr)-1) / elem->size)) runtime·panicstring("makechan: size out of range"); if(elem->alg >= nelem(runtime·algarray)) { diff --git a/test/chan/zerosize.go b/test/chan/zerosize.go new file mode 100644 index 00000000000..617c9dab341 --- /dev/null +++ b/test/chan/zerosize.go @@ -0,0 +1,16 @@ +// $G $D/$F.go && $L $F.$A && ./$A.out + +// Copyright 2011 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. + +// Making channels of a zero-sized type should not panic. + +package main + +func main() { + _ = make(chan [0]byte) + _ = make(chan [0]byte, 1) + _ = make(chan struct{}) + _ = make(chan struct{}, 1) +}