handle typedesc params in VM (#22581)

* handle typedesc params in VM

fixes #15760

* add test

* fix getType(typedesc) test

(cherry picked from commit 2e4e2f8f50)
This commit is contained in:
metagn
2023-08-30 08:23:14 +03:00
committed by narimiran
parent 855f5c8b81
commit 78d4aa3d01
3 changed files with 28 additions and 3 deletions

View File

@@ -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:

18
tests/vm/ttypedesc.nim Normal file
View File

@@ -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"

View File

@@ -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)