// Copyright 2021 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 for slice to array pointer conversion introduced in go1.17 // See: https://tip.golang.org/ref/spec#Conversions_from_slice_to_array_pointer package main func main() { s := make([]byte, 2, 4) if s0 := (*[0]byte)(s); s0 == nil { panic("converted from non-nil slice result in nil array pointer") } if s2 := (*[2]byte)(s); &s2[0] != &s[0] { panic("the converted array is not slice underlying array") } wantPanic( func() { _ = (*[4]byte)(s) // panics: len([4]byte) > len(s) }, "runtime error: array length is greater than slice length", ) var t []string if t0 := (*[0]string)(t); t0 != nil { panic("nil slice converted to *[0]byte should be nil") } wantPanic( func() { _ = (*[1]string)(t) // panics: len([1]string) > len(t) }, "runtime error: array length is greater than slice length", ) f() } type arr [2]int func f() { s := []int{1, 2, 3, 4} _ = *(*arr)(s) } func wantPanic(fn func(), s string) { defer func() { err := recover() if err == nil { panic("expected panic") } if got := err.(error).Error(); got != s { panic("expected panic " + s + " got " + got) } }() fn() }