Thread overview
Very strange compilation error
Oct 15, 2014
Jack Applegame
Oct 15, 2014
John Colvin
Oct 15, 2014
Nils Boßung
Oct 16, 2014
John Colvin
Oct 15, 2014
Nils Boßung
October 15, 2014
I don't understand why this code doesn't compile:

http://dpaste.dzfl.pl/dfd8df7f80ad
October 15, 2014
On Wednesday, 15 October 2014 at 19:29:27 UTC, Jack Applegame wrote:
> I don't understand why this code doesn't compile:
>
> http://dpaste.dzfl.pl/dfd8df7f80ad

that should be immutable(ubyte)[] not immutable ubyte[] which is equivalent to immutable(ubyte[]). You can't overwrite immutable data, hence the error.
October 15, 2014
On Wednesday 15 October 2014 21:29, Jack Applegame wrote:

> I don't understand why this code doesn't compile:
> 
> http://dpaste.dzfl.pl/dfd8df7f80ad

Immutability issues with unions ring a bell for me. This may be related to issue 12885 [1] which is the result of dmd pull #2665 [2] which even mentions std.date.SysTime.

Here's a reduced version of your test case:
---
struct Rebindable
{
    union
    {
        int m;
        immutable int i;
    }
    void opAssign(Rebindable another) {}
}

struct Foo3
{
    // Remove the union or _timezone and dmd accepts it.
    union
    {
        int m;
        immutable int i;
    }
    Rebindable _timezone;
}

void main()
{
    Foo3 foo3;
    foo3 = Foo3();
}
---

[1] https://issues.dlang.org/show_bug.cgi?id=12885
[2] https://github.com/D-Programming-Language/dmd/pull/2665

October 15, 2014
On Wednesday 15 October 2014 22:13, John Colvin wrote:

> On Wednesday, 15 October 2014 at 19:29:27 UTC, Jack Applegame wrote:
>> I don't understand why this code doesn't compile:
>>
>> http://dpaste.dzfl.pl/dfd8df7f80ad
> 
> that should be immutable(ubyte)[] not immutable ubyte[] which is
> equivalent to immutable(ubyte[]). You can't overwrite immutable
> data, hence the error.

Then

  Foo1 foo1; foo1 = Foo1(); // compiles

shouldn't compile either.

October 16, 2014
On Wednesday, 15 October 2014 at 21:28:05 UTC, Nils Boßung wrote:
> On Wednesday 15 October 2014 22:13, John Colvin wrote:
>
>> On Wednesday, 15 October 2014 at 19:29:27 UTC, Jack Applegame
>> wrote:
>>> I don't understand why this code doesn't compile:
>>>
>>> http://dpaste.dzfl.pl/dfd8df7f80ad
>> 
>> that should be immutable(ubyte)[] not immutable ubyte[] which is
>> equivalent to immutable(ubyte[]). You can't overwrite immutable
>> data, hence the error.
>
> Then
>
>   Foo1 foo1; foo1 = Foo1(); // compiles
>
> shouldn't compile either.

Good point. That's an accepts-invalid IMO.

Nonetheless:
union { string a; immutable ubyte[] b; }
is broken, it is effectively casting away immutability.
union { string a; immutable(ubyte)[] b; } is the correct approach.