assert(object) fails to adhere to the principle of least surprise
Bernard Helyer
b.helyer at gmail.com
Sat Jan 29 04:02:57 PST 2011
If I do
if (object) {
...
}
What happens is fairly obvious, and is equivalent to
if (object !is null) {
}
However, if I do
auto object = new Object();
assert(object);
What I expect to happen is
assert(object !is null);
Just as in the above example. What happens however is the program seg
faults. Why? Because it turns out what DMD turns it (silently) into is
object.checkInvariants(); // Whatever it's called.
This is bad enough, however it gets pants-on-head stupid as *object is
not checked for null*. I think the silent rewrite is bad design, but not
checking for null is so stupid, so obvious to anyone who actually uses
the language, I can't believe it's existed for so long. The fact that
assert(object);
and
import std.exception;
enforce(object);
do different things boggles my mind. One must write
assert(object !is null);
or
assert(!!object);
and every day it's like a giant stabbing pain. A stupid wrong headed
design that makes my experience with D _worse_. Just expose a method for
checking the invariant explicitly, and don't do this silent rewrite
bullshit. Any chance of getting a change of behaviour?
FWIW, GDC doesn't do the rewrite, and SDC (the compiler I'm working on
github.com/bhelyer/sdc) won't either.
More information about the Digitalmars-d
mailing list