35 lines
529 B
Nim
35 lines
529 B
Nim
discard """
|
|
output: '''10
|
|
string'''
|
|
"""
|
|
|
|
# bug #18059
|
|
type
|
|
C = ref object of RootObj
|
|
fn: ContProc
|
|
ex: ref Exception
|
|
|
|
ContProc = proc (c: C): C {.nimcall.}
|
|
|
|
proc noop(c: C): C = c
|
|
|
|
type
|
|
Env[T] = ref object of C
|
|
x: T
|
|
|
|
proc foo_cont[U](c: C): C =
|
|
proc afterCall[V](c: C): C =
|
|
echo Env[V](c).x
|
|
|
|
c.fn = afterCall[U]
|
|
return noop(c)
|
|
|
|
proc foo[T](x: T): C =
|
|
return Env[T](fn: foo_cont[T], x: x)
|
|
|
|
proc tramp(c: sink C) =
|
|
while c != nil and c.fn != nil:
|
|
c = c.fn(c)
|
|
|
|
tramp foo(10)
|
|
tramp foo("string")
|