mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: on Wasm and AIX, let deferred nil function panic at invocation
The Go spec requires If a deferred function value evaluates to nil, execution panics when the function is invoked, not when the "defer" statement is executed. On Wasm and AIX, currently we actually emit a nil check at the point of defer statement, which will make it panic too early. This CL fixes this. Also, on Wasm, now the nil function will be passed through deferreturn to jmpdefer, which does an explicit nil check and calls sigpanic if it is nil. This sigpanic, being called from assembly, is ABI0. So change the assembler backend to also handle sigpanic in ABI0. Fixes #34926. Updates #8047. Change-Id: I28489a571cee36d2aef041f917b8cfdc31d557d4 Reviewed-on: https://go-review.googlesource.com/c/go/+/201297 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
dc37bd2ac9
commit
c4817f5d4f
3 changed files with 38 additions and 2 deletions
33
test/defernil.go
Normal file
33
test/defernil.go
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
// run
|
||||
|
||||
// Copyright 2019 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.
|
||||
|
||||
// Check that deferring a nil function causes a proper
|
||||
// panic when the deferred function is invoked (not
|
||||
// when the function is deferred).
|
||||
// See Issue #8047 and #34926.
|
||||
|
||||
package main
|
||||
|
||||
var x = 0
|
||||
|
||||
func main() {
|
||||
defer func() {
|
||||
err := recover()
|
||||
if err == nil {
|
||||
panic("did not panic")
|
||||
}
|
||||
if x != 1 {
|
||||
panic("FAIL")
|
||||
}
|
||||
}()
|
||||
f()
|
||||
}
|
||||
|
||||
func f() {
|
||||
var nilf func()
|
||||
defer nilf()
|
||||
x = 1
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue