atilaneves / dpp

Directly include C headers in D source code
Boost Software License 1.0
229 stars 31 forks source link

Ugly code for anonymous union inside struct #297

Open Temtaime opened 2 years ago

Temtaime commented 2 years ago
struct B
{
    union
    {
        int a;
        char c;
    };
};

Produces:

extern (C)
{
    struct B
    {
        static union _Anonymous_0
        {
            int a;
            char c;
        }

        _Anonymous_0 _anonymous_1;
        ref auto a() @property @nogc pure nothrow
        {
            return _anonymous_1.a;
        }

        void a(_T_)(auto ref _T_ val) @property @nogc pure nothrow
        {
            _anonymous_1.a = val;
        }

        ref auto c() @property @nogc pure nothrow
        {
            return _anonymous_1.c;
        }

        void c(_T_)(auto ref _T_ val) @property @nogc pure nothrow
        {
            _anonymous_1.c = val;
        }
    }
}

I do not see any reasons for those properties. Anonymous unions are allowed in D.

atilaneves commented 2 years ago

I just copied the definition into a D file and it compiled fine. I don't remember/know why it was done this way, but given the way I work (TDD) I doubt it was for no reason but who knows. Maybe there was a reason and there isn't anymore.

In any case, the translations aren't really meant to be read - and while this is apparently unneeded, it also doesn't cause any problems. If you feel like tackling it, then PRs welcome.

Temtaime commented 2 years ago

There are problems.

    B b;
    int* a = &b.a;

Error: cannot implicitly convert expression &b.a of type extern (C) int delegate() pure nothrow @nogc @property ref @safe to int*

atilaneves commented 2 years ago

There are problems.

I would have led with that instead of "ugly code" ;)

Adding a test now.