https://issues.dlang.org/show_bug.cgi?id=12944

          Issue ID: 12944
           Summary: std.variant does not observe value semantics for large
                    value types.
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Phobos
          Assignee: nob...@puremagic.com
          Reporter: opantm2+db...@gmail.com

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.

--

Reply via email to