parent
86e79f5cec
commit
0acdaea334
2 changed files with 59 additions and 3 deletions
|
|
@ -708,6 +708,10 @@ proc genAddSubInt(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode) =
|
||||||
c.genNarrow(n, dest)
|
c.genNarrow(n, dest)
|
||||||
|
|
||||||
proc genConv(c: PCtx; n, arg: PNode; dest: var TDest; opc=opcConv) =
|
proc genConv(c: PCtx; n, arg: PNode; dest: var TDest; opc=opcConv) =
|
||||||
|
if n.typ.kind == arg.typ.kind and arg.typ.kind == tyProc:
|
||||||
|
# don't do anything for lambda lifting conversions:
|
||||||
|
gen(c, arg, dest)
|
||||||
|
return
|
||||||
let tmp = c.genx(arg)
|
let tmp = c.genx(arg)
|
||||||
if dest < 0: dest = c.getTemp(n.typ)
|
if dest < 0: dest = c.getTemp(n.typ)
|
||||||
c.gABC(n, opc, dest, tmp)
|
c.gABC(n, opc, dest, tmp)
|
||||||
|
|
@ -1740,9 +1744,9 @@ proc gen(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags = {}) =
|
||||||
of declarativeDefs:
|
of declarativeDefs:
|
||||||
unused(n, dest)
|
unused(n, dest)
|
||||||
of nkLambdaKinds:
|
of nkLambdaKinds:
|
||||||
let s = n.sons[namePos].sym
|
#let s = n.sons[namePos].sym
|
||||||
discard genProc(c, s)
|
#discard genProc(c, s)
|
||||||
genLit(c, n.sons[namePos], dest)
|
genLit(c, newSymNode(n.sons[namePos].sym), dest)
|
||||||
of nkChckRangeF, nkChckRange64, nkChckRange:
|
of nkChckRangeF, nkChckRange64, nkChckRange:
|
||||||
let
|
let
|
||||||
tmp0 = c.genx(n.sons[0])
|
tmp0 = c.genx(n.sons[0])
|
||||||
|
|
|
||||||
52
tests/vm/tanonproc.nim
Normal file
52
tests/vm/tanonproc.nim
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
discard """
|
||||||
|
output: '''`Test`'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
# bug #3561
|
||||||
|
|
||||||
|
import macros, future, strutils
|
||||||
|
|
||||||
|
type
|
||||||
|
Option[T] = ref object
|
||||||
|
case valid: bool
|
||||||
|
of true:
|
||||||
|
data: T
|
||||||
|
else:
|
||||||
|
discard
|
||||||
|
|
||||||
|
proc some[T](v: T): Option[T] = Option[T](valid: true, data: v)
|
||||||
|
proc none[T](v: T): Option[T] = Option[T](valid: false)
|
||||||
|
proc none(T: typedesc): Option[T] = Option[T](valid: false)
|
||||||
|
|
||||||
|
proc map[T,U](o: Option[T], f: T -> U): Option[U] =
|
||||||
|
case o.valid
|
||||||
|
of true:
|
||||||
|
f(o.data).some
|
||||||
|
else:
|
||||||
|
U.none
|
||||||
|
|
||||||
|
proc notEmpty(o: Option[string]): Option[string] =
|
||||||
|
case o.valid
|
||||||
|
of true:
|
||||||
|
if o.data.strip == "": string.none else: o.data.strip.some
|
||||||
|
else:
|
||||||
|
o
|
||||||
|
|
||||||
|
proc getOrElse[T](o: Option[T], def: T): T =
|
||||||
|
case o.valid
|
||||||
|
of true:
|
||||||
|
o.data
|
||||||
|
else:
|
||||||
|
def
|
||||||
|
|
||||||
|
proc quoteStr(s: string): Option[string] =
|
||||||
|
s.some.notEmpty.map(v => "`" & v & "`")
|
||||||
|
|
||||||
|
macro str(s: string): stmt =
|
||||||
|
let x = s.strVal
|
||||||
|
let y = quoteStr(x)
|
||||||
|
let sn = newStrLitNode(y.getOrElse("NONE"))
|
||||||
|
result = quote do:
|
||||||
|
echo `sn`
|
||||||
|
|
||||||
|
str"Test"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue