mirror of
https://github.com/golang/go
synced 2024-11-22 18:24:48 -07:00
cmd/compile: nilcheck interface value in go/defer interface call for SSA
This matches the behavior of the legacy backend. Fixes #15975 (if this is the intended behavior) Change-Id: Id277959069b8b8bf9958fa8f2cbc762c752a1a19 Reviewed-on: https://go-review.googlesource.com/23820 Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
0324a3f828
commit
f3689d1382
@ -2573,6 +2573,9 @@ func (s *state) call(n *Node, k callKind) *ssa.Value {
|
||||
}
|
||||
i := s.expr(fn.Left)
|
||||
itab := s.newValue1(ssa.OpITab, Types[TUINTPTR], i)
|
||||
if k != callNormal {
|
||||
s.nilCheck(itab)
|
||||
}
|
||||
itabidx := fn.Xoffset + 3*int64(Widthptr) + 8 // offset of fun field in runtime.itab
|
||||
itab = s.newValue1I(ssa.OpOffPtr, Types[TUINTPTR], itabidx, itab)
|
||||
if k == callNormal {
|
||||
|
36
test/fixedbugs/issue15975.go
Normal file
36
test/fixedbugs/issue15975.go
Normal file
@ -0,0 +1,36 @@
|
||||
// run
|
||||
|
||||
// Copyright 2016 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
|
||||
|
||||
var fail bool
|
||||
|
||||
type Closer interface {
|
||||
Close()
|
||||
}
|
||||
|
||||
func nilInterfaceDeferCall() {
|
||||
var x Closer
|
||||
defer x.Close()
|
||||
// if it panics when evaluating x.Close, it should not reach here
|
||||
fail = true
|
||||
}
|
||||
|
||||
func shouldPanic(f func()) {
|
||||
defer func() {
|
||||
if recover() == nil {
|
||||
panic("did not panic")
|
||||
}
|
||||
}()
|
||||
f()
|
||||
}
|
||||
|
||||
func main() {
|
||||
shouldPanic(nilInterfaceDeferCall)
|
||||
if fail {
|
||||
panic("fail")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user