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