Jonathan M Davis:

> assert(0) has the advantage of being a normal assertion in non-release mode.

What is this useful for? To me this looks like a significant disadvantage. If I 
want a HALT (to tell the compiler a point can't be reached, etc) I want it in 
every kind of compilation of the program.


> It also makes it clear that that code path should _never_ be reached.

The replacement for assert(0) is meant to be more clear in its purpose compared 
to assert(0). It may be named thisCantHappen(), or assertZero(), etc.


> The real question though is whether you can convince Walter (which I doubt, 
> but I don't know).

This topic was already discussed, and I think the result of the discussion was 
that this change of assert(false) is not worth it. But if asserts gets inproved 
for other purposes, then this is a chance to work on improving assert(0) too.


> Still, making such a change _would_ contradict TDPL, which is supposed to be 
> a major no-no at this point.<

I like TDPL, I respect Andrei and you, I agree that TDPL is a kind of reference 
for D2, but please stop using TDPL as a The Bible in many of your posts. Not 
even Andrei himself looks so religiously attached as you to the contents of 
TDPL :-) A little flexibility is acceptable.

--------------------------

Adam Ruppe:

>Again, I think this makes sense too. assert(n) is saying, in principle, 
>"ensure n is valid". Calling the invariant is part of ensuring it is valid. 
>The only problem is a minor bug - it forgets to check for null before calling 
>the invariant. That should, of course, be fixed, but the main behavior makes 
>sense.<

Something like class_instance.invariant() is better because:
- It's explicit and readable. While you need to read the D manual to know that 
assert(class_instance) tests the invariant too, and not just that 
class_instance reference is not null. I remember other persons in D.learn not 
knowning/suprised by that assert(class_instance) tests the invariant too.
- It removes a special case, and special cases kill languages. Struct instances 
too allow an invariant, but they are not callable with assert(), see below. A 
syntax like structlass_instance.invariant() is shared with the class one.

struct Foo {
    int x;
    invariant() { assert(x == 1); }
}
void main() {
    Foo f;
    assert(f);
}


DMD 2.051:
test.d(7): Error: expression f of type Foo does not have a boolean value

Bye,
bearophile

Reply via email to