Has someone encountered similar issues with -cov?

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Sat Jul 2 05:26:34 PDT 2016


On 07/02/2016 02:45 AM, Patrick Schluter wrote:
> On Friday, 1 July 2016 at 20:09:30 UTC, Andrei Alexandrescu wrote:
>> On 7/1/16 3:43 PM, Patrick Schluter wrote:
>>> On Friday, 1 July 2016 at 16:30:41 UTC, Andrei Alexandrescu wrote:
>>>> https://issues.dlang.org/show_bug.cgi?id=16224 -- Andrei
>>>
>>> That
>>>
>>>     do {
>>>     } while(0)
>>>
>>> construct is ridiculous. It's cargo cult at its worst.
>>
>> That escalated quickly. -- Andrei
>
> Nothing personal. As I said in the initial message, I had to put up with
> that construct for the last 15 years because my colleague loves it. So I
> had ample time to learn to hate it with a passion.

How would you reshape this? It's important that the call to hook is 
physically at the end of the function and issued just in that place, and 
that the code does not do any redundant work.

U hook(U, T)(T value) { return U.init; }

U opCast(U, T)(T payload)
{
	import std.traits;
	do
	{
		static if (!isUnsigned!T && isUnsigned!U &&
				   T.sizeof <= U.sizeof)
		{
			if (payload < 0) break; // extra check needed
		}
		auto result = cast(U) payload;
		if (result != payload) break;
		static if (isUnsigned!T && !isUnsigned!U)
		{
			static assert(U.sizeof <= T.sizeof);
			if (result < 0) break;
		}
		return result;
	} while (0);
	return hook!U(payload);
}

void main()
{
	opCast!short(42);
}


Thanks,

Andrei


More information about the Digitalmars-d mailing list