few more fixes for static params in macros; new failing test cases for static evaluation

This commit is contained in:
Zahary Karadjov 2014-03-09 16:04:58 +02:00
commit 5aa486cf11
2 changed files with 58 additions and 15 deletions

View file

@ -602,15 +602,24 @@ proc semObjectNode(c: PContext, n: PNode, prev: PType): PType =
incl(result.flags, tfFinal) incl(result.flags, tfFinal)
proc addParamOrResult(c: PContext, param: PSym, kind: TSymKind) = proc addParamOrResult(c: PContext, param: PSym, kind: TSymKind) =
if kind == skMacro and param.typ.kind notin {tyTypeDesc, tyStatic}: template addDecl(x) =
if sfGenSym notin x.flags: addDecl(c, x)
if kind == skMacro:
if param.typ.kind == tyTypeDesc:
addDecl(param)
elif param.typ.kind == tyStatic:
var a = copySym(param)
a.typ = param.typ.base
addDecl(a)
else:
# within a macro, every param has the type PNimrodNode! # within a macro, every param has the type PNimrodNode!
# and param.typ.kind in {tyTypeDesc, tyExpr, tyStmt}:
let nn = getSysSym"PNimrodNode" let nn = getSysSym"PNimrodNode"
var a = copySym(param) var a = copySym(param)
a.typ = nn.typ a.typ = nn.typ
if sfGenSym notin a.flags: addDecl(c, a) addDecl(a)
else: else:
if sfGenSym notin param.flags: addDecl(c, param) addDecl(param)
let typedescId = getIdent"typedesc" let typedescId = getIdent"typedesc"

View file

@ -4,9 +4,16 @@ discard """
3 3
1 1
2 2
3
1
2
3
1
2
3''' 3'''
""" """
when false:
const s = @[1,2,3] const s = @[1,2,3]
macro foo: stmt = macro foo: stmt =
@ -19,3 +26,30 @@ static:
for e in s: for e in s:
echo e echo e
macro bar(x: static[seq[int]]): stmt =
for e in x:
echo e
bar s
bar(@[1, 2, 3])
type
TData = tuple
letters: seq[string]
numbers: seq[int]
const data: TData = (@["aa", "bb"], @[11, 22])
static:
for x in data.letters:
echo x
var m = data
for x in m.letters:
echo x
macro ff(d: static[TData]): stmt =
for x in d.letters:
echo x
ff(data)