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