Improving assert-printing in DMD

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Fri Oct 2 06:18:37 PDT 2015


On 10/02/2015 08:15 AM, Per Nordlöw wrote:
> On Friday, 2 October 2015 at 11:19:51 UTC, Andrei Alexandrescu wrote:
>> assert(e1 == e2)
>>
>> could be lowered into:
>>
>> {
>>   auto a = e1, b = e2;
>>   if (a == b) return;
>>   onAssertFailed!"=="(a, b, __FILE__, __LINE__, __FUNCTION__,
>> __MODULE__);
>> }()
>
> So lowering is kind of like macro expansion for AST-nodes, then?

Not sure what you mean. The code up there will be replaced with the code 
down there :o).

> Is DMD clever enough to avoid trigger postblits for
>
>>   auto a = e1, b = e2;
>>   if (a == b) return;
>
> ? Or is that part of the question whether this will work?

Ah, interesting. There is a means in the compiler to generate ref 
variables, which is not accessible for user code. But perhaps that's not 
necessary if we do the lowering as such:

(auto ref a, auto ref b) {
   if (a == b) return;
   onAssertFailed!"=="(a, b, __FILE__, __LINE__, __FUNCTION__, __MODULE__);
}(e1, e2)

So that evaluates the two expressions and avoids creating copies for 
lvalues.

> I guess we only need on symbol name for `onAssertFailed` then instead of
> `assertBinOp` and `assertUnOp`, right?

Probably a judgment call. I'd start with one and see what happens.


Andrei


More information about the Digitalmars-d mailing list