mirror of
https://github.com/nim-lang/Nim.git
synced 2026-05-05 21:44:46 +00:00
fixes #23690
```nim
dest.`:state` = src.`:state`
var :tmp_553651276 = dest.e1.a
`=wasMoved`(dest.e1.a)
dest.e1.a.kind = src.e1.a.kind
case dest.e1.a.kind
of 0:
dest.e1.a.a = src.e1.a.a
of 1:
`=copy`(dest.e1.a.c, src.e1.a.c)
case :tmp_553651276.kind
of 0:
of 1:
`=destroy`(:tmp_553651276.c)
```
`dest.e1.a.kind = src.e1.a.kind` changes the discrimant but it fails to
clear the memory of `dest.e1.a`. Before using hooks for copying, we need
to clear the dest, e.g. `=wasMoved(dest.e1.a.c)`.
```nim
dest.`:state` = src.`:state`
var :tmp_553651276 = dest.e1.a
`=wasMoved`(dest.e1.a)
dest.e1.a.kind = src.e1.a.kind
case dest.e1.a.kind
of 0:
`=wasMoved`(dest.e1.a.a)
dest.e1.a.a = src.e1.a.a
`=wasMoved`(dest.e1.a.b)
of 1:
`=wasMoved`(dest.e1.a.c)
`=copy`(dest.e1.a.c, src.e1.a.c)
case :tmp_553651276.kind
of 0:
of 1:
`=destroy`(:tmp_553651276.c)
```
(cherry picked from commit 262ff648aa)
This commit is contained in:
@@ -338,3 +338,29 @@ block:
|
||||
doAssert ff.s == 12
|
||||
|
||||
mainSync()
|
||||
|
||||
import std/sequtils
|
||||
|
||||
# bug #23690
|
||||
type
|
||||
SomeObj* = object of RootObj
|
||||
|
||||
Item* = object
|
||||
case kind*: 0..1
|
||||
of 0:
|
||||
a*: int
|
||||
b*: SomeObj
|
||||
of 1:
|
||||
c*: string
|
||||
|
||||
ItemExt* = object
|
||||
a*: Item
|
||||
b*: string
|
||||
|
||||
proc do1(x: int): seq[(string, Item)] =
|
||||
result = @[("zero", Item(kind: 1, c: "first"))]
|
||||
|
||||
proc do2(x: int, e: ItemExt): seq[(string, ItemExt)] =
|
||||
do1(x).map(proc(v: (string, Item)): auto = (v[0], ItemExt(a: v[1], b: e.b)))
|
||||
|
||||
doAssert $do2(0, ItemExt(a: Item(kind: 1, c: "second"), b: "third")) == """@[("zero", (a: (kind: 1, c: "first"), b: "third"))]"""
|
||||
|
||||
Reference in New Issue
Block a user