Bug 12944 – std.variant does not observe value semantics for large value types.

Status
NEW
Severity
normal
Priority
P3
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2014-06-19T01:30:17Z
Last change time
2024-12-01T16:21:29Z
Assigned to
No Owner
Creator
Kapps
Moved to GitHub: phobos#10062 →

Comments

Comment #0 by opantm2+dbugs — 2014-06-19T01:30:17Z
Assigning a Variant to another Variant which contains a large value type causes both Variants to have a reference to the same value. Currently this is not a huge issue because the only way to modify the Variant's reference to a large value type (that is, larger than Variant.size which is 32 bytes on x64), is through the use of peek on a struct. This will become a larger issue when std.variant supports static arrays however. Sample: import std.variant; struct Foo { int foo; ubyte[32] padding; } void main() { Foo f; f.foo = 3; Variant v = f; Variant v2 = v; auto fp = v.peek!Foo; fp.foo = 6; assert(v2.get!Foo.foo == 3); // fails } Commenting out the padding makes this work as expected.
Comment #1 by opantm2+dbugs — 2014-06-19T01:38:47Z
Also worth noting that fixing this would require all peek and operations that alter the value (i.e., opIndexAssign) to allocate if storing a reference to another Variant. https://github.com/D-Programming-Language/phobos/pull/2188#issuecomment-44763385 has some discussion on this. It could get somewhat expensive, but would only be in the rare situations where this bug could be observed.
Comment #2 by robert.schadek — 2024-12-01T16:21:29Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/10062 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB