Improving assert-printing in DMD

Atila Neves via Digitalmars-d digitalmars-d at puremagic.com
Sat Oct 31 02:25:42 PDT 2015


On Tuesday, 29 September 2015 at 21:02:42 UTC, Nordlöw wrote:
> As a follow-up to
>
> https://github.com/D-Programming-Language/phobos/pull/3207#issuecomment-144073495
>
> I starting digging in DMD for logic controlling behaviour of 
> assert(), especially whether it's possible to add automatic 
> printing of `lhs` and `rhs` upon assertion failure if 
> `AssertExp` is a binary expression say `lhs == rhs`.
>
> After grepping for `AssertExp` the only possible place I could 
> think of was
>
> ToElemVisitor::visit(AssertExp *ae)
>
> inside
>
> elem *toElem(Expression *e, IRState *irs)
>
> in file e2ir.c.
>
> Questions:
>
> 1. Is this the right place where this lhs-rhs-printing logic 
> should be added? If so could somebody tell me how to make this 
> happen?
>
> 2. Is it possible to from within DMD generate expressions that 
> do
>
> `import std.stdio : write`
>
> and then calls write on the `lhs` and `rsh`...or this a 
> completely wrong approach to solving this problem?

More thoughts on this: what about ranges and testing for 
equality? It would be helpful if either this DIP made the 
compiler recognise and deal with `std.algorithm.equal` 
differently or recognise that on one or both sides of `==` 
there's a range.

I'm thinking of all the different `shouldXXX` functions I wrote 
for unit-threaded. Equality is by far the most common thing to 
assert on in a test, but there are other useful ones that need to 
be considered. Two that come to mind right now are asserting that 
a range contains an element and that two ranges are the same 
ignoring ordering.

For the former, `assert(range.canFind(elt))` would be hard to 
deal with in this DIP. I don't see a better way, however, since 
`in` only works for AAs.

For the latter... I don't know either.

Atila







More information about the Digitalmars-d mailing list