On 6/1/18 1:41 PM, Russel Winder wrote:
struct Datum {
        public const int a;
        public const int b;
}

struct Message {
        Datum datum;
}

I found the bug. Basically, the Variant static if is failing because the assignment it is checking (assigning a Message to a Message) would overwrite const data. But it's not really overwriting existing data, it's emplacing into new data (always). So this check is not correct.

Much simpler test case:

struct S
{
   const int x;
}

void main()
{
   import std.variant;
   import std.stdio;
   Variant v = S(1);
   writeln(v.get!S); // same failure
}


If I replace the check in std.variant:

                static if (is(typeof(*cast(T*) target = *src)) ||

with:

                static if (is(typeof(delegate T() {return *src;})) ||

Then it works (both your code, and the simple example).

Note that in all cases, variant is returning a COPY of the data, not a reference, so it shouldn't be possible to violate const.

Please, file a bug. I will see if I can submit a PR to fix.

-Steve

Reply via email to