mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
* fix #16758 Nim crashes in fixAbstractType * Update compiler/semexprs.nim Co-authored-by: Andreas Rumpf <rumpf_a@web.de> Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
@@ -693,6 +693,9 @@ proc semArrayConstr(c: PContext, n: PNode, flags: TExprFlags; expectedType: PTyp
|
||||
proc fixAbstractType(c: PContext, n: PNode) =
|
||||
for i in 1..<n.len:
|
||||
let it = n[i]
|
||||
if it == nil:
|
||||
localError(c.config, n.info, "'$1' has nil child at index $2" % [renderTree(n, {renderNoComments}), $i])
|
||||
return
|
||||
# do not get rid of nkHiddenSubConv for OpenArrays, the codegen needs it:
|
||||
if it.kind == nkHiddenSubConv and
|
||||
skipTypes(it.typ, abstractVar).kind notin {tyOpenArray, tyVarargs}:
|
||||
|
||||
38
tests/macros/t16758.nim
Normal file
38
tests/macros/t16758.nim
Normal file
@@ -0,0 +1,38 @@
|
||||
discard """
|
||||
errormsg: "'blk.p(a)' has nil child at index 1"
|
||||
action: reject
|
||||
"""
|
||||
import macros
|
||||
|
||||
type BlockLiteral[T] = object
|
||||
p: T
|
||||
|
||||
proc p[T](a:int) = echo 1
|
||||
proc p[T](a:string) = echo "a"
|
||||
|
||||
iterator arguments(formalParams: NimNode): NimNode =
|
||||
var iParam = 0
|
||||
for i in 1 ..< formalParams.len:
|
||||
let pp = formalParams[i]
|
||||
for j in 0 .. pp.len - 3:
|
||||
yield pp[j]
|
||||
inc iParam
|
||||
|
||||
macro implementInvoke(T: typedesc): untyped =
|
||||
let t = getTypeImpl(T)[1]
|
||||
|
||||
let call = newCall(newDotExpr(ident"blk", ident"p"))
|
||||
let params = copyNimTree(t[0])
|
||||
result = newProc(ident"invoke", body = call)
|
||||
# result[2] = newTree(nnkGenericParams,T)
|
||||
for n in arguments(params):
|
||||
call.add(n)
|
||||
|
||||
params.insert(1, newIdentDefs(ident"blk", newTree(nnkBracketExpr, bindSym"BlockLiteral", T)))
|
||||
result.params = params
|
||||
|
||||
proc getInvoke(T: typedesc) =
|
||||
implementInvoke(T)
|
||||
|
||||
|
||||
getInvoke(proc(a: int))
|
||||
Reference in New Issue
Block a user