mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-08 22:13:29 +00:00
don't try to transform objconstr/cast type nodes (#24636)
fixes #24631 [Object constructors](793baf34ff/compiler/semobjconstr.nim (L462)), [casts](793baf34ff/compiler/semexprs.nim (L494)) and [type conversions](793baf34ff/compiler/semexprs.nim (L419)) copy their type nodes verbatim instead of producing semchecked type nodes. This causes a crash in transf when an untyped expression in the type node has `nil` type. To deal with this, don't try to transform the type node in these expressions at all. I couldn't reproduce the problem with type conversion nodes though so those are unchanged in transf.
This commit is contained in:
@@ -106,6 +106,13 @@ proc transformSons(c: PTransf, n: PNode, noConstFold = false): PNode =
|
||||
for i in 0..<n.len:
|
||||
result[i] = transform(c, n[i], noConstFold)
|
||||
|
||||
proc transformSonsAfterType(c: PTransf, n: PNode, noConstFold = false): PNode =
|
||||
result = newTransNode(n)
|
||||
assert n.len != 0
|
||||
result[0] = copyTree(n[0])
|
||||
for i in 1..<n.len:
|
||||
result[i] = transform(c, n[i], noConstFold)
|
||||
|
||||
proc newAsgnStmt(c: PTransf, kind: TNodeKind, le: PNode, ri: PNode; isFirstWrite: bool): PNode =
|
||||
result = newTransNode(kind, ri.info, 2)
|
||||
result[0] = le
|
||||
@@ -1102,6 +1109,9 @@ proc transform(c: PTransf, n: PNode, noConstFold = false): PNode =
|
||||
result = transformAddrDeref(c, n, {nkAddr, nkHiddenAddr})
|
||||
of nkHiddenStdConv, nkHiddenSubConv, nkConv:
|
||||
result = transformConv(c, n)
|
||||
of nkObjConstr, nkCast:
|
||||
# don't try to transform type node
|
||||
result = transformSonsAfterType(c, n)
|
||||
of nkDiscardStmt:
|
||||
result = n
|
||||
if n[0].kind != nkEmpty:
|
||||
|
||||
15
tests/template/tgenericobjconstr.nim
Normal file
15
tests/template/tgenericobjconstr.nim
Normal file
@@ -0,0 +1,15 @@
|
||||
discard """
|
||||
matrix: "--skipParentCfg"
|
||||
"""
|
||||
|
||||
# issue #24631
|
||||
|
||||
type
|
||||
V[d: static bool] = object
|
||||
l: int
|
||||
|
||||
template y(): V[false] = V[false](l: 0)
|
||||
discard y()
|
||||
|
||||
template z(): V[false] = cast[V[false]](V[false](l: 0))
|
||||
discard z()
|
||||
Reference in New Issue
Block a user