mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
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:
@@ -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
18
tests/vm/ttypedesc.nim
Normal 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"
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user