Semfold for nil cast (#16030)

* bring back the semfold of nil

* remove space

* fix test

* proc type can't be dereferenced
This commit is contained in:
cooldome
2020-11-18 17:19:57 +00:00
committed by GitHub
parent 33d79b9e64
commit 87d3e5331a
3 changed files with 8 additions and 5 deletions

View File

@@ -71,8 +71,10 @@ proc genLiteral(p: BProc, n: PNode, ty: PType): Rope =
p.module.s[cfsData].addf(
"static NIM_CONST $1 $2 = {NIM_NIL,NIM_NIL};$n",
[getTypeDesc(p.module, ty), result])
else:
elif k in {tyPointer, tyNil, tyProc}:
result = rope("NIM_NIL")
else:
result = "(($1) NIM_NIL)" % [getTypeDesc(p.module, ty)]
of nkStrLit..nkTripleStrLit:
let k = if ty == nil: tyString
else: skipTypes(ty, abstractVarRange + {tyStatic, tyUserTypeClass, tyUserTypeClassInst}).kind

View File

@@ -674,7 +674,7 @@ proc getConstExpr(m: PSym, n: PNode; idgen: IdGenerator; g: ModuleGraph): PNode
of nkCast:
var a = getConstExpr(m, n[1], idgen, g)
if a == nil: return
if n.typ != nil and n.typ.kind in NilableTypes and a.kind != nkNilLit:
if n.typ != nil and n.typ.kind in NilableTypes:
# we allow compile-time 'cast' for pointer types:
result = a
result.typ = n.typ

View File

@@ -70,6 +70,7 @@ block:
static:
doAssert cast[RootRef](nil).repr == "nil"
block:
static:
doAssert cast[cstring](nil).repr == "nil"
# Issue #15730, not fixed yet
# block:
# static:
# doAssert cast[cstring](nil).repr == "nil"