Fix 26144; exception propagation for non-raising virtual methods (#26145)

ref #26144

The C backend must not use `sfNeverRaises` to remove exception checks
from
virtual method calls. The flag describes only the selected base method
body,
while a vtable override may raise a catchable exception.

This change makes `canRaiseDisp` conservative for `skMethod` symbols and
adds a
regression test covering an exception raised by a child method invoked
through a
base reference.

(cherry picked from commit 8cb406cd7a)
This commit is contained in:
Ryan McConnell
2026-08-29 08:41:05 -04:00
committed by narimiran
parent 05eb886d96
commit dad4e388b8
2 changed files with 25 additions and 1 deletions

View File

@@ -0,0 +1,20 @@
discard """
output: '''caught'''
"""
type
Base = ref object of RootObj
Child = ref object of Base
method run(value: Base): string {.base.} =
result = "base"
method run(value: Child): string =
raise newException(ValueError, "child")
let value: Base = Child()
try:
discard value.run()
quit "virtual method did not raise"
except ValueError:
echo "caught"