// 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() }