fix #17836 (typed macro isNil for proc params) (#17841)

thanks @alaviss for the test
This commit is contained in:
Saem Ghani
2021-04-25 01:30:52 -07:00
committed by GitHub
parent ffe4328b35
commit 17db15f9b1
3 changed files with 21 additions and 2 deletions

View File

@@ -1171,6 +1171,7 @@ when defined(useNodeIds):
var gNodeId: int
proc newNode*(kind: TNodeKind): PNode =
## new node with unknown line info, no type, and no children
result = PNode(kind: kind, info: unknownLineInfo)
when defined(useNodeIds):
result.id = gNodeId
@@ -1180,6 +1181,7 @@ proc newNode*(kind: TNodeKind): PNode =
inc gNodeId
proc newNodeI*(kind: TNodeKind, info: TLineInfo): PNode =
## new node with line info, no type, and no children
result = PNode(kind: kind, info: info)
when defined(useNodeIds):
result.id = gNodeId
@@ -1189,6 +1191,7 @@ proc newNodeI*(kind: TNodeKind, info: TLineInfo): PNode =
inc gNodeId
proc newNodeI*(kind: TNodeKind, info: TLineInfo, children: int): PNode =
## new node with line info, type, and children
result = PNode(kind: kind, info: info)
if children > 0:
newSeq(result.sons, children)
@@ -1200,6 +1203,7 @@ proc newNodeI*(kind: TNodeKind, info: TLineInfo, children: int): PNode =
inc gNodeId
proc newNodeIT*(kind: TNodeKind, info: TLineInfo, typ: PType): PNode =
## new node with line info, type, and no children
result = newNode(kind)
result.info = info
result.typ = typ

View File

@@ -1513,8 +1513,8 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
# reference with the value `nil`, so `isNil` should be false!
(node.kind == nkNilLit and nfIsRef notin node.flags) or
(not node.typ.isNil and node.typ.kind == tyProc and
node.typ.callConv == ccClosure and node[0].kind == nkNilLit and
node[1].kind == nkNilLit))
node.typ.callConv == ccClosure and node.safeLen > 0 and
node[0].kind == nkNilLit and node[1].kind == nkNilLit))
of opcNBindSym:
# cannot use this simple check
# if dynamicBindSym notin c.config.features:

15
tests/macros/t17836.nim Normal file
View File

@@ -0,0 +1,15 @@
import macros
# Ensure that `isNil` works in the typed macro context when pass procs.
type
O = object
fn: proc(i: int): int
var o: O
macro typedBug(expr: typed) =
doAssert expr[1] != nil
doAssert not expr[1].isNil
typedBug(o.fn)