From 28a8896d57f315b241b77eff26d9302cfe88c13b Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Sun, 19 Nov 2023 21:00:17 -0800 Subject: [PATCH] cmd/compile/internal/inline: allow inlining of checkptr arguments The early return here is meant to suppress inlining of the function call itself. However, it also suppresses recursing to visit the call arguments, which are safe to inline. Change-Id: I75887574c00931cb622277d04a822bc84c29bfa2 Reviewed-on: https://go-review.googlesource.com/c/go/+/543658 Auto-Submit: Matthew Dempsky Reviewed-by: Than McIntosh LUCI-TryBot-Result: Go LUCI --- src/cmd/compile/internal/inline/inl.go | 2 +- .../{issue35073.go => issue35073a.go} | 0 test/fixedbugs/issue35073b.go | 23 +++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) rename test/fixedbugs/{issue35073.go => issue35073a.go} (100%) create mode 100644 test/fixedbugs/issue35073b.go diff --git a/src/cmd/compile/internal/inline/inl.go b/src/cmd/compile/internal/inline/inl.go index d89be8437d..d808c438ca 100644 --- a/src/cmd/compile/internal/inline/inl.go +++ b/src/cmd/compile/internal/inline/inl.go @@ -863,7 +863,7 @@ func inlnode(callerfn *ir.Func, n ir.Node, bigCaller bool, inlCalls *[]*ir.Inlin if base.Debug.Checkptr != 0 { switch types.ReflectSymName(s) { case "Value.UnsafeAddr", "Value.Pointer": - return n + n.NoInline = true } } } diff --git a/test/fixedbugs/issue35073.go b/test/fixedbugs/issue35073a.go similarity index 100% rename from test/fixedbugs/issue35073.go rename to test/fixedbugs/issue35073a.go diff --git a/test/fixedbugs/issue35073b.go b/test/fixedbugs/issue35073b.go new file mode 100644 index 0000000000..8cdc6c184d --- /dev/null +++ b/test/fixedbugs/issue35073b.go @@ -0,0 +1,23 @@ +// errorcheck -0 -d=checkptr -m + +// Copyright 2020 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. + +// Test that we can inline the receiver arguments for +// reflect.Value.UnsafeAddr/Pointer, even in checkptr mode. + +package main + +import ( + "reflect" + "unsafe" +) + +func main() { + n := 10 // ERROR "moved to heap: n" + m := make(map[string]string) // ERROR "moved to heap: m" "make\(map\[string\]string\) escapes to heap" + + _ = unsafe.Pointer(reflect.ValueOf(&n).Elem().UnsafeAddr()) // ERROR "inlining call" + _ = unsafe.Pointer(reflect.ValueOf(&m).Elem().Pointer()) // ERROR "inlining call" +}