runtime: preserve recover error values#1882
Conversation
|
CI note: normal PR CI is running from the fork branch I attempted to dispatch the manual-only I also attempted to dispatch Per branch policy, I did not push an upstream |
699e9cf to
82b8a1a
Compare
|
Updated PR after rebasing onto current Additional tests run locally:
The earlier Ubuntu |
|
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
|
Update from commit 6b65c2c:\n\n- Fixed direct vs indirect recover scoping and nested panic stack handling; removed the recover1.go xfail entries covered by this PR.\n- Kept recover.go xfails: the remaining failure is reflect/interface type identity in test9reflect2, not the recover/defer panic root.\n- Kept recover4.go xfails: SIGBUS is now routed to the panic path, but the remaining mismatch is stale local/named-result state after fault recovery (memcopy returned 0 vs 131067), which I am not mixing into this recover/defer PR.\n- Kept deferprint.go and fixedbugs/bug409.go xfails: remaining mismatches are float print exponent formatting (+e+00 vs +e+000).\n\nLocal validation:\n- go test ./test/go -count=1\n- go test ./test/goroot -count=1 -run TestGoRootRunCases -args -goroot |
|
Update after 77ceb09:
Focused tests passed locally: test/go recover cases via Go and llgo, recover4.go goroot with and without xfail, recover.go goroot with retained xfail, go test ./test/go, go test ./ssa, go test ./cl, and runtime/internal/runtime inside the runtime module. |
|
Update for commit
Focused checks passed:
Known unrelated non-covered check: |
|
Update for
Local validation:
|
Summary
recover()values assert toerrorandruntime.Error.TypeAssertionErrorvalues for compiler-generated failed type assertions, and fix slice-to-array conversion panic bounds order.recoversemantics through compiler-generated method wrappers when the wrapper is itself the deferred call, while keeping nested wrapper calls non-recovering.fixedbugs/issue73917.goandfixedbugs/issue73920.go: a recover in a real helper call reached through deferred promoted wrappers remains indirect, and the outer deferred recover still sees the panic.longjmprecovery by emitting volatile loads/stores for local SSA allocs in functions with recover blocks.test/gocoverage for recovered runtime errors, type assertion panic values, method-wrapper recover semantics, embedded wrapper function-pointer recover semantics, and fault recovery preserving named results; remove the now-passingrecover2.go,zerodivide.go,recover4.go,fixedbugs/issue73917.go, andfixedbugs/issue73920.goGOROOT xfails.Still XFail / Out of Scope
recover.goremains xfail in this PR. On this branch it still fails before the recover-10 path with the ssa: panic with runtime type assertion errors #1892 interface type identity issue:interface conversion: interface {} is func(*main.T1), not func(*main.T1) (types from different scopes).missing recover 10is covered independently bytest/go.test/gocases are Go 1.26+ semantic coverage. Go 1.24 has pre-Go 1.26 behavior for the upstreamissue73917.go/issue73920.goprograms, so those local tests skip under Go <1.26.test/gocurrently hits unrelated nil/range behavior inTestRangeOverNilArrayPointerCallIsEvaluated; this PR intentionally does not cover nil/range, chan, print, interface, reflect, GC, liveness, finalizer, or goroutine domains.Testing
go test ./test/go -run 'TestRecoverThrough|TestRecoverAfterFault' -count=1go run ./cmd/llgo test -run 'TestRecoverThrough|TestRecoverAfterFault' -count=1 ./test/gogo test ./test/goroot -run TestGoRootRunCases/recover4.go -count=1 -args -goroot "$(go env GOROOT)" -dirs . -case '^recover4\.go$' -xfail /tmp/llgo-empty-xfail.yamlgo test ./test/goroot -run TestGoRootRunCases/recover4.go -count=1 -args -goroot "$(go env GOROOT)" -dirs . -case '^recover4\.go$'go test ./test/goroot -run TestGoRootRunCases/recover.go -count=1 -args -goroot "$(go env GOROOT)" -dirs . -case '^recover\.go$'(passes via retained xfail)go test ./test/goroot -run TestGoRootRunCases/recover.go -count=1 -args -goroot "$(go env GOROOT)" -dirs . -case '^recover\.go$' -xfail /tmp/llgo-empty-xfail.yaml(expected failure: ssa: panic with runtime type assertion errors #1892 interface type identity blocker)go test ./test/go -run 'TestDeferredEmbedded.*MethodWrapperKeepsIndirectRecoverNil|TestRecoverThrough' -count=1/Users/lijie/sdk/go1.26.0/bin/go test ./test/go -run 'TestDeferredEmbedded.*MethodWrapperKeepsIndirectRecoverNil' -count=1 -v/Users/lijie/sdk/go1.26.0/bin/go run ./cmd/llgo test -run 'TestDeferredEmbedded.*MethodWrapperKeepsIndirectRecoverNil|TestRecoverThrough' -count=1 ./test/gogo test ./test/goroot -run TestGoRootRunCases -count=1 -args -goroot /Users/lijie/sdk/go1.26.0 -dirs fixedbugs -case '^fixedbugs/issue739(17|20)\.go$'go test ./test/go -count=1(cd runtime && go test ./internal/runtime -count=1)go test ./ssa -count=1go test ./cl -count=1/Users/lijie/sdk/go1.26.0/bin/go test ./test/go -count=1(known unrelated failure:TestRangeOverNilArrayPointerCallIsEvaluatednil array pointer range SIGSEGV)GOROOT CI
Full GOROOT CI is disabled/too slow for regular PR validation in this repo and the
GOROOTworkflow is manual-only. This PR keeps stable coverage intest/goand lists the exact targeted GOROOT commands above. I will monitor the available PR checks after pushing the fork head branch; I will not push branches toxgo-dev/llgo.