mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
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 <mdempsky@google.com> Reviewed-by: Than McIntosh <thanm@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
parent
0709f1bb00
commit
28a8896d57
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
23
test/fixedbugs/issue35073b.go
Normal file
23
test/fixedbugs/issue35073b.go
Normal file
@ -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"
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user