Nil checks need to stay in their original blocks. They cannot
be moved to a following conditionally-executed block.
Fixes #72860
Change-Id: Ic2d66cdf030357d91f8a716a004152ba4c016f77
Reviewed-on: https://go-review.googlesource.com/c/go/+/657715
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
// SelectN is typically, ultimately, a register.
continue
}
+ if opcodeTable[v.Op].nilCheck {
+ // Nil checks need to stay in their block. See issue 72860.
+ continue
+ }
// Count arguments which will need a register.
narg := 0
for _, a := range v.Args {
--- /dev/null
+// 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 f(p *int, b bool) int {
+ valid := *p >= 0
+ if !b || !valid {
+ return 5
+ }
+ return 6
+}
+func main() {
+ defer func() {
+ if e := recover(); e == nil {
+ println("should have panicked")
+ }
+ }()
+ f(nil, false)
+}