fixes #20141; dereferencing pointer to incomplete type error with cast (#20147)

Co-authored-by: xflywind <43030857+xflywind@users.noreply.github.com>
This commit is contained in:
ringabout
2022-09-28 19:57:47 +08:00
committed by GitHub
parent fe8feb46c6
commit e33e9e4a32
2 changed files with 32 additions and 0 deletions

View File

@@ -2189,6 +2189,11 @@ proc genSomeCast(p: BProc, e: PNode, d: var TLoc) =
elif etyp.kind == tyBool and srcTyp.kind in IntegralTypes:
putIntoDest(p, d, e, "(($1) != 0)" % [rdCharLoc(a)], a.storage)
else:
if etyp.kind == tyPtr:
# generates the definition of structs for casts like cast[ptr object](addr x)[]
let internalType = etyp.skipTypes({tyPtr})
if internalType.kind == tyObject:
discard getTypeDesc(p.module, internalType)
putIntoDest(p, d, e, "(($1) ($2))" %
[getTypeDesc(p.module, e.typ), rdCharLoc(a)], a.storage)

27
tests/ccgbugs/t20141.nim Normal file
View File

@@ -0,0 +1,27 @@
discard """
joinable: false
"""
# bug #20141
type
A = object
B = object
U = proc()
proc m(h: var B) = discard
template n[T, U](x: U): T =
static: doAssert true
cast[ptr T](addr x)[]
proc k() =
var res: A
m(n[B](res))
proc w(mounter: U) = discard
proc mount(proto: U) = discard
proc v() = mount k
# This is required for failure
w(v)