mirror of
https://github.com/golang/go
synced 2024-11-27 00:01:23 -07:00
f983a9340d
This CL changes the inliner to process transitive inlining iteratively after the AST has actually been edited, rather than recursively and immediately. This is important for handling indirect function calls correctly, because ir.reassigned walks the function body looking for reassignments; whereas previously the inlined reassignments might not have been actually added to the AST yet. Fixes #54632. Change-Id: I0dd69813c8a70b965174e0072335bc00afedf286 Reviewed-on: https://go-review.googlesource.com/c/go/+/425257 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: David Chase <drchase@google.com>
32 lines
609 B
Go
32 lines
609 B
Go
// run
|
|
|
|
// Copyright 2022 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.
|
|
|
|
// The inliner would erroneously scan the caller function's body for
|
|
// reassignments *before* substituting the inlined function call body,
|
|
// which could cause false positives in deciding when it's safe to
|
|
// transitively inline indirect function calls.
|
|
|
|
package main
|
|
|
|
func main() {
|
|
bug1()
|
|
bug2(fail)
|
|
}
|
|
|
|
func bug1() {
|
|
fn := fail
|
|
fn = pass
|
|
fn()
|
|
}
|
|
|
|
func bug2(fn func()) {
|
|
fn = pass
|
|
fn()
|
|
}
|
|
|
|
func pass() {}
|
|
func fail() { panic("FAIL") }
|