mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-12 04:09:34 +00:00
39 lines
1.4 KiB
Nim
39 lines
1.4 KiB
Nim
discard """
|
|
output: '''9'''
|
|
"""
|
|
|
|
# Regression test for object-field serialization of static-generic instances
|
|
# under `nim ic`.
|
|
#
|
|
# A generic object's instances SHARE one field PSym (same itemId) while each
|
|
# instance carries a DISTINCT field type, e.g. `Digest[32].data: array[32,byte]`
|
|
# vs `Digest[48].data: array[48,byte]` (this is exactly nimcrypto's `MDigest`,
|
|
# which crashed compiling nimbus's `altair.nim`). The `.s.bif` writer DEFs each
|
|
# field once inside its owning type's reclist and references it as a bare SymUse
|
|
# elsewhere, deduping by a per-Writer `emittedFieldSyms` set. That set wrongly
|
|
# spanned DIFFERENT type reclists: after the first instance's `data` def, every
|
|
# other instance's reclist got a typeless SymUse stub instead of its own typed
|
|
# def. On load that field had a nil `typ`/`owner`, and `=destroy` lifting
|
|
# (`liftdestructors.fillBodyObj`) dereferenced it -> SIGSEGV. The fix scopes the
|
|
# dedup per-reclist so each instance reclist is a self-contained typed def.
|
|
#
|
|
# The `seq` field forces `=destroy` to be lifted for `Outer`, which walks the
|
|
# reclists of both `Digest` instances (the crash path).
|
|
|
|
type
|
|
Digest[n: static int] = object
|
|
data: array[n, byte]
|
|
Outer = object
|
|
a: Digest[32]
|
|
b: Digest[48]
|
|
s: seq[int]
|
|
|
|
proc use(o: Outer): int =
|
|
result = o.a.data[0].int + o.b.data[0].int + o.s.len
|
|
|
|
var o: Outer
|
|
o.a.data[0] = 4
|
|
o.b.data[0] = 2
|
|
o.s = @[1, 2, 3]
|
|
echo use(o)
|