atilaneves/dpp

Ugly code for anonymous union inside struct

Temtaime opened this issue · 3 comments

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.

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.

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*

There are problems.

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

Adding a test now.