aboutsummaryrefslogtreecommitdiff
path: root/test/fixedbugs
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2025-03-14 13:19:18 -0700
committerKeith Randall <khr@golang.org>2025-03-19 09:55:46 -0700
commitdeb6790fcfe943c640a4ef393036690eef5eef5c (patch)
tree9f683e750cdd3031f76bd5c4f67b44e35b0299f9 /test/fixedbugs
parent56e5476e10db25ce71f562bd6ee0910a83532b04 (diff)
downloadgo-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.go70
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()
+}