On 9/27/14 3:45 AM, Daniel Murphy wrote:
"H. S. Teoh via Digitalmars-d"  wrote in message
news:[email protected]...

Argh, looks like another incompletely-implemented part of the compiler:

void fun() @safe {
union U {
int  p;
int* q;
}
U u;
u.p++; // compiles
u.q = null; // compiles
*u.q++; // x.d(9): Error: field U.q cannot be accessed in @safe code
because > it overlaps with a pointer

I think that this is equivalent to u.q++, since the ++ does not apply to the pointed-at variable, but at the pointer itself.

Weird, my tests showed that this was allowed.

More testing, I realize it's because it's a class variable.

This code compiles and runs:

class Foo
{
    union
    {
        int x;
        int *p;
    }

    void foo() @safe {*p = 5;}
}

void main() @safe
{
    auto f = new Foo;
    f.foo();
}

Which is similar to this code that does not:

void main() @safe
{
    union U {
        int x;
        int *p;
    }
    U u;
    *u.p = 5; // error
}

Without unions, you can't create invalid pointers in @safe code.
With unions, you can, but you can't access them.

The above shows you can in some situations, but I think that is a bug.

-Steve

Reply via email to