mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-31 18:32:11 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user