mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
make fillObjectFields recur over base type (#24854)
fixes #24847
Object constructors call `fillObjectFields` when a field inside the
constructor does not have a location, however when the field is from a
base type this does not process it. Now `fillObjectFields` also calls
itself for the base type to fix this but not sure if this is a good
solution as `fillObjectFields` is used in other places too.
(cherry picked from commit a625fab098)
This commit is contained in:
@@ -768,6 +768,8 @@ proc fillObjectFields*(m: BModule; typ: PType) =
|
||||
# this fact here.
|
||||
var check = initIntSet()
|
||||
discard getRecordFields(m, typ, check)
|
||||
if typ.baseClass != nil:
|
||||
fillObjectFields(m, typ.baseClass.skipTypes(skipPtrs))
|
||||
|
||||
proc mangleDynLibProc(sym: PSym): Rope
|
||||
|
||||
|
||||
30
tests/objects/t24847.nim
Normal file
30
tests/objects/t24847.nim
Normal file
@@ -0,0 +1,30 @@
|
||||
# issue #24847
|
||||
|
||||
block: # original issue test
|
||||
type
|
||||
R[C] = ref object of RootObj
|
||||
b: C
|
||||
K[S] = ref object of R[S]
|
||||
W[J] = object
|
||||
case y: bool
|
||||
of false, true: discard
|
||||
|
||||
proc e[T]() = discard K[T]()
|
||||
iterator h(): int {.closure.} = e[W[int]]()
|
||||
let _ = h
|
||||
type U = distinct int
|
||||
e[W[U]]()
|
||||
|
||||
block: # simplified
|
||||
type
|
||||
R[C] = ref object of RootObj
|
||||
b: C
|
||||
K[S] = ref object of R[S]
|
||||
W[J] = object
|
||||
case y: bool
|
||||
of false, true: discard
|
||||
|
||||
type U = distinct int
|
||||
|
||||
discard K[W[int]]()
|
||||
discard K[W[U]]()
|
||||
Reference in New Issue
Block a user