diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-05-27 19:17:51 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-05-27 19:18:08 +0200 |
commit | 6d76df84546dd90d33a413c0bbd8df75f797767a (patch) | |
tree | 1deca5384e48fc7c7c642761843b83a1ee9cf228 /compiler/evaltempl.nim | |
parent | 6ff66bfd519f076b5453b1bdcf94086b4ee658f4 (diff) | |
download | Nim-6d76df84546dd90d33a413c0bbd8df75f797767a.tar.gz |
fixes #4227
Diffstat (limited to 'compiler/evaltempl.nim')
-rw-r--r-- | compiler/evaltempl.nim | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/compiler/evaltempl.nim b/compiler/evaltempl.nim index a5a132005..794e35d74 100644 --- a/compiler/evaltempl.nim +++ b/compiler/evaltempl.nim @@ -59,7 +59,7 @@ proc evalTemplateAux(templ, actual: PNode, c: var TemplCtx, result: PNode) = evalTemplateAux(templ.sons[i], actual, c, res) result.add res -proc evalTemplateArgs(n: PNode, s: PSym): PNode = +proc evalTemplateArgs(n: PNode, s: PSym; fromHlo: bool): PNode = # if the template has zero arguments, it can be called without ``()`` # `n` is then a nkSym or something similar var totalParams = case n.kind @@ -75,7 +75,7 @@ proc evalTemplateArgs(n: PNode, s: PSym): PNode = # their bodies. We could try to fix this, but it may be # wiser to just deprecate immediate templates and macros # now that we have working untyped parameters. - genericParams = if sfImmediate in s.flags: 0 + genericParams = if sfImmediate in s.flags or fromHlo: 0 else: s.ast[genericParamsPos].len expectedRegularParams = <s.typ.len givenRegularParams = totalParams - genericParams @@ -92,6 +92,7 @@ proc evalTemplateArgs(n: PNode, s: PSym): PNode = for i in givenRegularParams+1 .. expectedRegularParams: let default = s.typ.n.sons[i].sym.ast if default.isNil or default.kind == nkEmpty: + echo "fuck you ", genericParams localError(n.info, errWrongNumberOfArguments) addSon(result, ast.emptyNode) else: @@ -104,14 +105,14 @@ proc evalTemplateArgs(n: PNode, s: PSym): PNode = var evalTemplateCounter* = 0 # to prevent endless recursion in templates instantiation -proc evalTemplate*(n: PNode, tmpl, genSymOwner: PSym): PNode = +proc evalTemplate*(n: PNode, tmpl, genSymOwner: PSym; fromHlo=false): PNode = inc(evalTemplateCounter) if evalTemplateCounter > 100: globalError(n.info, errTemplateInstantiationTooNested) result = n # replace each param by the corresponding node: - var args = evalTemplateArgs(n, tmpl) + var args = evalTemplateArgs(n, tmpl, fromHlo) var ctx: TemplCtx ctx.owner = tmpl ctx.genSymOwner = genSymOwner |