mirror of
https://github.com/golang/go
synced 2024-11-18 05:44:47 -07:00
c82304b712
For defer/go calls, the function/method value are evaluated immediately. So after devirtualizing, it may trigger a panic when implicitly deref a nil pointer receiver, causing the program behaves unexpectedly. It's safer to not devirtualizing defer/go calls at all. Fixes #52072 Change-Id: I562c2860e3e577b36387dc0a12ae5077bc0766bf Reviewed-on: https://go-review.googlesource.com/c/go/+/428495 Reviewed-by: Michael Knyszek <mknyszek@google.com> Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
33 lines
415 B
Go
33 lines
415 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.
|
|
|
|
package main
|
|
|
|
type I interface{ M() }
|
|
|
|
type T struct {
|
|
x int
|
|
}
|
|
|
|
func (T) M() {}
|
|
|
|
var pt *T
|
|
|
|
func f() (r int) {
|
|
defer func() { recover() }()
|
|
|
|
var i I = pt
|
|
defer i.M()
|
|
r = 1
|
|
return
|
|
}
|
|
|
|
func main() {
|
|
if got := f(); got != 1 {
|
|
panic(got)
|
|
}
|
|
}
|