From 78d4aa3d0108fad32ca200eb4f12cd09be48635f Mon Sep 17 00:00:00 2001 From: metagn Date: Wed, 30 Aug 2023 08:23:14 +0300 Subject: [PATCH] handle typedesc params in VM (#22581) * handle typedesc params in VM fixes #15760 * add test * fix getType(typedesc) test (cherry picked from commit 2e4e2f8f5076b39e5976ba20f231f468b1b5052c) --- compiler/vmgen.nim | 8 +++++++- tests/vm/ttypedesc.nim | 18 ++++++++++++++++++ tests/vm/tvmmisc.nim | 5 +++-- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 tests/vm/ttypedesc.nim diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 0ce90a4158..6d556fa9d4 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -1534,6 +1534,7 @@ proc checkCanEval(c: PCtx; n: PNode) = # little hack ahead for bug #12612: assume gensym'ed variables # are in the right scope: if sfGenSym in s.flags and c.prc.sym == nil: discard + elif s.kind == skParam and s.typ.kind == tyTypeDesc: discard else: cannotEval(c, n) elif s.kind in {skProc, skFunc, skConverter, skMethod, skIterator} and sfForward in s.flags: @@ -2088,8 +2089,13 @@ proc gen(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags = {}) = let s = n.sym checkCanEval(c, n) case s.kind - of skVar, skForVar, skTemp, skLet, skParam, skResult: + of skVar, skForVar, skTemp, skLet, skResult: genRdVar(c, n, dest, flags) + of skParam: + if s.typ.kind == tyTypeDesc: + genTypeLit(c, s.typ, dest) + else: + genRdVar(c, n, dest, flags) of skProc, skFunc, skConverter, skMacro, skTemplate, skMethod, skIterator: # 'skTemplate' is only allowed for 'getAst' support: if s.kind == skIterator and s.typ.callConv == TCallingConvention.ccClosure: diff --git a/tests/vm/ttypedesc.nim b/tests/vm/ttypedesc.nim new file mode 100644 index 0000000000..a112584c54 --- /dev/null +++ b/tests/vm/ttypedesc.nim @@ -0,0 +1,18 @@ +block: # issue #15760 + type + Banana = object + SpecialBanana = object + + proc getName(_: type Banana): string = "Banana" + proc getName(_: type SpecialBanana): string = "SpecialBanana" + + proc x[T](): string = + const n = getName(T) # this one works + result = n + + proc y(T: type): string = + const n = getName(T) # this one failed to compile + result = n + + doAssert x[SpecialBanana]() == "SpecialBanana" + doAssert y(SpecialBanana) == "SpecialBanana" diff --git a/tests/vm/tvmmisc.nim b/tests/vm/tvmmisc.nim index d1c9ace405..e5fb5755ea 100644 --- a/tests/vm/tvmmisc.nim +++ b/tests/vm/tvmmisc.nim @@ -1,10 +1,11 @@ -# bug #4462 import macros import os +# bug #4462 block: proc foo(t: typedesc) {.compileTime.} = - assert sameType(getType(t), getType(int)) + assert sameType(getType(t), getType(typedesc[int])) + assert sameType(getType(t), getType(type int)) static: foo(int)