]> Cypherpunks.ru repositories - gostls13.git/blobdiff - test/chancap.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / chancap.go
index b3e40233f5b29a9a9ff60bfd43e55ac74312facc..8dce9247cd45ef710ef728c1d85d1e2d7c28e9e4 100644 (file)
@@ -8,8 +8,17 @@
 
 package main
 
+import (
+       "strings"
+       "unsafe"
+)
+
+type T chan int
+
+const ptrSize = unsafe.Sizeof((*byte)(nil))
+
 func main() {
-       c := make(chan int, 10)
+       c := make(T, 10)
        if len(c) != 0 || cap(c) != 10 {
                println("chan len/cap ", len(c), cap(c), " want 0 10")
                panic("fail")
@@ -23,9 +32,40 @@ func main() {
                panic("fail")
        }
 
-       c = make(chan int)
+       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()
 }