This commit is contained in:
Andreas Rumpf
2016-04-04 02:45:43 +02:00
parent 86e79f5cec
commit 0acdaea334
2 changed files with 59 additions and 3 deletions

View File

@@ -708,6 +708,10 @@ proc genAddSubInt(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode) =
c.genNarrow(n, dest)
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)
if dest < 0: dest = c.getTemp(n.typ)
c.gABC(n, opc, dest, tmp)
@@ -1740,9 +1744,9 @@ proc gen(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags = {}) =
of declarativeDefs:
unused(n, dest)
of nkLambdaKinds:
let s = n.sons[namePos].sym
discard genProc(c, s)
genLit(c, n.sons[namePos], dest)
#let s = n.sons[namePos].sym
#discard genProc(c, s)
genLit(c, newSymNode(n.sons[namePos].sym), dest)
of nkChckRangeF, nkChckRange64, nkChckRange:
let
tmp0 = c.genx(n.sons[0])

52
tests/vm/tanonproc.nim Normal file
View 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"