diff options
| author | Keith Randall <khr@golang.org> | 2025-03-14 13:19:18 -0700 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2025-03-19 09:55:46 -0700 |
| commit | deb6790fcfe943c640a4ef393036690eef5eef5c (patch) | |
| tree | 9f683e750cdd3031f76bd5c4f67b44e35b0299f9 /test/fixedbugs | |
| parent | 56e5476e10db25ce71f562bd6ee0910a83532b04 (diff) | |
| download | go-deb6790fcfe943c640a4ef393036690eef5eef5c.tar.xz | |
cmd/compile: remove implicit deref from len(p) where p is ptr-to-array
func f() *[4]int { return nil }
_ = len(f())
should not panic. We evaluate f, but there isn't a dereference
according to the spec (just "arg is evaluated").
Update #72844
Change-Id: Ia32cefc1b7aa091cd1c13016e015842b4d12d5b4
Reviewed-on: https://go-review.googlesource.com/c/go/+/658096
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'test/fixedbugs')
| -rw-r--r-- | test/fixedbugs/issue72844.go | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/test/fixedbugs/issue72844.go b/test/fixedbugs/issue72844.go new file mode 100644 index 0000000000..0322841ded --- /dev/null +++ b/test/fixedbugs/issue72844.go @@ -0,0 +1,70 @@ +// run + +// Copyright 2025 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. + +package main + +//go:noinline +func nilPtrFunc() *[4]int { + return nil +} + +var nilPtrVar *[4]int + +func testLen1() { + _ = len(*nilPtrFunc()) +} + +func testLen2() { + _ = len(nilPtrFunc()) +} + +func testLen3() { + _ = len(*nilPtrVar) +} + +func testLen4() { + _ = len(nilPtrVar) +} + +func testRange1() { + for range *nilPtrFunc() { + } +} +func testRange2() { + for range nilPtrFunc() { + } +} +func testRange3() { + for range *nilPtrVar { + } +} +func testRange4() { + for range nilPtrVar { + } +} + +func main() { + //shouldPanic(testLen1) + shouldNotPanic(testLen2) + shouldNotPanic(testLen3) + shouldNotPanic(testLen4) + //shouldPanic(testRange1) + shouldNotPanic(testRange2) + shouldNotPanic(testRange3) + shouldNotPanic(testRange4) +} + +func shouldPanic(f func()) { + defer func() { + if e := recover(); e == nil { + panic("should have panicked") + } + }() + f() +} +func shouldNotPanic(f func()) { + f() +} |
