mirror of
https://github.com/nim-lang/Nim.git
synced 2026-09-01 19:33:42 +00:00
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)
21 lines
372 B
Nim
21 lines
372 B
Nim
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"
|