]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/inline: allow inlining of checkptr arguments
authorMatthew Dempsky <mdempsky@google.com>
Mon, 20 Nov 2023 05:00:17 +0000 (21:00 -0800)
committerGopher Robot <gobot@golang.org>
Mon, 20 Nov 2023 15:12:49 +0000 (15:12 +0000)
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 <mdempsky@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/cmd/compile/internal/inline/inl.go
test/fixedbugs/issue35073a.go [moved from test/fixedbugs/issue35073.go with 100% similarity]
test/fixedbugs/issue35073b.go [new file with mode: 0644]

index d89be8437d77677aa3542e7feadaa3c5543d497c..d808c438ca233e8cc4cae5d41af6c2563ab26d09 100644 (file)
@@ -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/issue35073b.go b/test/fixedbugs/issue35073b.go
new file mode 100644 (file)
index 0000000..8cdc6c1
--- /dev/null
@@ -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"
+}