1// run 2 3// Copyright 2023 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 7package main 8 9import ( 10 "strings" 11 "unsafe" 12) 13 14func shift[T any]() int64 { 15 return 1 << unsafe.Sizeof(*new(T)) 16} 17 18func div[T any]() uintptr { 19 return 1 / unsafe.Sizeof(*new(T)) 20} 21 22func add[T any]() int64 { 23 return 1<<63 - 1 + int64(unsafe.Sizeof(*new(T))) 24} 25 26func main() { 27 shift[[62]byte]() 28 shift[[63]byte]() 29 shift[[64]byte]() 30 shift[[100]byte]() 31 shift[[1e6]byte]() 32 33 add[[1]byte]() 34 shouldPanic("divide by zero", func() { div[[0]byte]() }) 35} 36 37func shouldPanic(str string, f func()) { 38 defer func() { 39 err := recover() 40 if err == nil { 41 panic("did not panic") 42 } 43 s := err.(error).Error() 44 if !strings.Contains(s, str) { 45 panic("got panic " + s + ", want " + str) 46 } 47 }() 48 49 f() 50} 51