diff options
author | Matthew Dempsky <mdempsky@google.com> | 2022-09-12 13:01:57 -0700 |
---|---|---|
committer | Matthew Dempsky <mdempsky@google.com> | 2022-09-19 18:58:26 +0000 |
commit | ceffdc8545c3155b030de9e91d399dc34bd3c678 (patch) | |
tree | fb5079fbaef6a3178c80927ea89df3a2a7bc1c4b /test/convert4.go | |
parent | 29153be75763b7cbf9395d732f454336e3df0286 (diff) | |
download | go-ceffdc8545c3155b030de9e91d399dc34bd3c678.tar.gz go-ceffdc8545c3155b030de9e91d399dc34bd3c678.zip |
cmd/compile: implement slice-to-array conversions
The conversion T(x) is implemented as *(*T)(x). Accordingly, runtime
panic messages for (*T)(x) are made more general.
Fixes #46505.
Change-Id: I76317c0878b6a5908299506d392eed50d7ef6523
Reviewed-on: https://go-review.googlesource.com/c/go/+/430415
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Jenny Rakoczy <jenny@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'test/convert4.go')
-rw-r--r-- | test/convert4.go | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/test/convert4.go b/test/convert4.go index 2bc9c96a52..3cc0aea7be 100644 --- a/test/convert4.go +++ b/test/convert4.go @@ -23,25 +23,47 @@ func wantPanic(fn func(), s string) { func main() { s := make([]byte, 8, 10) + for i := range s { + s[i] = byte(i) + } if p := (*[8]byte)(s); &p[0] != &s[0] { panic("*[8]byte conversion failed") } + if [8]byte(s) != *(*[8]byte)(s) { + panic("[8]byte conversion failed") + } wantPanic( func() { _ = (*[9]byte)(s) }, - "runtime error: cannot convert slice with length 8 to pointer to array with length 9", + "runtime error: cannot convert slice with length 8 to array or pointer to array with length 9", + ) + wantPanic( + func() { + _ = [9]byte(s) + }, + "runtime error: cannot convert slice with length 8 to array or pointer to array with length 9", ) var n []byte if p := (*[0]byte)(n); p != nil { panic("nil slice converted to *[0]byte should be nil") } + _ = [0]byte(n) z := make([]byte, 0) if p := (*[0]byte)(z); p == nil { panic("empty slice converted to *[0]byte should be non-nil") } + _ = [0]byte(z) + + var p *[]byte + wantPanic( + func() { + _ = [0]byte(*p) // evaluating *p should still panic + }, + "runtime error: invalid memory address or nil pointer dereference", + ) // Test with named types type Slice []int |