mirror of
https://github.com/golang/go.git
synced 2026-02-13 19:04:41 +00:00
This change improves the concrete type analysis in the devirtualizer,
it not longer relies on ir.Reassigned, it now statically tries to
determine the concrete type of an interface, even when assigned
multiple times, following type assertions and iface conversions.
Alternative to CL 649195
Updates #69521
Fixes #64824
Change-Id: Ib1656e19f3619ab2e1e6b2c78346cc320490b2af
GitHub-Last-Rev: e8fa0b12f0
GitHub-Pull-Request: golang/go#71935
Reviewed-on: https://go-review.googlesource.com/c/go/+/652036
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Keith Randall <khr@golang.org>
29 lines
798 B
Go
29 lines
798 B
Go
// 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.
|
|
|
|
package a
|
|
|
|
type I interface{ M() }
|
|
type T int
|
|
|
|
func (T) M() {} // ERROR "can inline T.M"
|
|
|
|
func E() I { // ERROR "can inline E"
|
|
return T(0) // ERROR "T\(0\) escapes to heap"
|
|
}
|
|
|
|
func F(i I) I { // ERROR "can inline F" "leaking param: i to result ~r0 level=0"
|
|
i = nil
|
|
return i
|
|
}
|
|
|
|
func g() {
|
|
h := E() // ERROR "inlining call to E" "T\(0\) does not escape"
|
|
h.M() // ERROR "devirtualizing h.M to T" "inlining call to T.M"
|
|
|
|
i := F(T(0)) // ERROR "inlining call to F" "T\(0\) does not escape"
|
|
|
|
// It is fine that we devirtualize here, as we add an additional nilcheck.
|
|
i.M() // ERROR "devirtualizing i.M to T" "inlining call to T.M"
|
|
}
|