From 3fa428c88beb376784e9683edd83b1cebc857f08 Mon Sep 17 00:00:00 2001 From: Araq Date: Tue, 7 Mar 2017 00:27:47 +0100 Subject: [PATCH] fixes #5467 --- compiler/renderer.nim | 6 +++++- compiler/semexprs.nim | 4 ++++ tests/template/tgensymregression.nim | 26 +++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 5ce8414d60..badcaea661 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -851,7 +851,11 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = put(g, tkRStrLit, '\"' & replace(n[1].strVal, "\"", "\"\"") & '\"') else: gsub(g, n.sons[1]) - of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: gsub(g, n.sons[1]) + of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: + if n.len >= 2: + gsub(g, n.sons[1]) + else: + put(g, tkSymbol, "(wrong conv)") of nkCast: put(g, tkCast, "cast") put(g, tkBracketLe, "[") diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index ba60442d6f..a419cd0008 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -2324,12 +2324,16 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = of nkIfExpr, nkIfStmt: result = semIf(c, n) of nkHiddenStdConv, nkHiddenSubConv, nkConv, nkHiddenCallConv: checkSonsLen(n, 2) + considerGenSyms(c, n) of nkStringToCString, nkCStringToString, nkObjDownConv, nkObjUpConv: checkSonsLen(n, 1) + considerGenSyms(c, n) of nkChckRangeF, nkChckRange64, nkChckRange: checkSonsLen(n, 3) + considerGenSyms(c, n) of nkCheckedFieldExpr: checkMinSonsLen(n, 2) + considerGenSyms(c, n) of nkTableConstr: result = semTableConstr(c, n) of nkClosedSymChoice, nkOpenSymChoice: diff --git a/tests/template/tgensymregression.nim b/tests/template/tgensymregression.nim index e758e0d9ac..0fadbde417 100644 --- a/tests/template/tgensymregression.nim +++ b/tests/template/tgensymregression.nim @@ -3,7 +3,8 @@ discard """ [0.0, 0.0, 0.0, 0.0] -5050''' +5050 +123''' """ template mathPerComponent(op: untyped): untyped = @@ -47,3 +48,26 @@ proc main2() = echo s main2() + +# bug #5467 +import macros + +converter int2string(x: int): string = $x + +template wrap(body: typed): untyped = + body + +macro makeProc(): typed = + # Make a template tree + result = (quote do: + proc someProc* = + wrap do: + let x = 123 + # Implicit conversion here + let s: string = x + echo s + ) + +makeProc() + +someProc()