diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-12-09 12:58:33 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-09 12:58:33 +0100 |
commit | c16963083d828b7920c221a5031b509c9824db4a (patch) | |
tree | 96bb340f7bad42f8289604c5cd2c7066d0a41e9d /tests | |
parent | 8035f408f1323ba81c8db794ad58687bace78afa (diff) | |
parent | e8747059710370819800bdc0742fa86761c6737b (diff) | |
download | Nim-c16963083d828b7920c221a5031b509c9824db4a.tar.gz |
Merge pull request #9912 from nim-lang/araq-fixes-nested-gensym
fixes nested gensym'ed parameters; fixes #9476
Diffstat (limited to 'tests')
-rw-r--r-- | tests/template/tparams_gensymed.nim | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/template/tparams_gensymed.nim b/tests/template/tparams_gensymed.nim index da86d63dc..91fa26596 100644 --- a/tests/template/tparams_gensymed.nim +++ b/tests/template/tparams_gensymed.nim @@ -70,3 +70,43 @@ proc genericProc(x: any) = concreteProc(7) # This works genericProc(7) # This doesn't compile + +import tables + +# bug #9476 +proc getTypeInfo*(T: typedesc): pointer = + var dummy: T + getTypeInfo(dummy) + + +macro implementUnary(op: untyped): untyped = + result = newStmtList() + + template defineTable(tableSymbol) = + var tableSymbol = initTable[pointer, pointer]() + let tableSymbol = genSym(nskVar, "registeredProcs") + result.add(getAst(defineTable(tableSymbol))) + + template defineRegisterInstantiation(tableSym, regTemplSym, instSym, op) = + template regTemplSym*(T: typedesc) = + let ti = getTypeInfo(T) + + proc instSym(xOrig: int): int {.gensym, cdecl.} = + let x {.inject.} = xOrig + op + + tableSym[ti] = cast[pointer](instSym) + + let regTemplSymbol = ident("registerInstantiation") + let instSymbol = ident("instantiation") + result.add(getAst(defineRegisterInstantiation( + tableSymbol, regTemplSymbol, instSymbol, op + ))) + + echo result.repr + + +implementUnary(): x*x + +registerInstantiation(int) +registerInstantiation(float) |