digitalmars.D - assert(object) fails to adhere to the principle of least surprise
- Bernard Helyer (33/33) Jan 29 2011 If I do
- Bernard Helyer (5/9) Jan 29 2011 This segfaults if object is null, which is obviously impossible in this
- Bernard Helyer (5/8) Jan 29 2011 It checks for null then checks the invariant.
- Tomek =?ISO-8859-2?Q?Sowi=F1ski?= (7/59) Jan 29 2011 =20
- Andrej Mitrovic (3/5) Jan 29 2011 Wow, that is an old-school bug (2007!). :p
- Simen kjaeraas (5/12) Jan 29 2011 That would be #107: Wrong filename in error message when using a mixin
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.
Jan 29 2011
A few corrections. On Sat, 29 Jan 2011 12:02:57 +0000, Bernard Helyer wrote:auto object = new Object(); assert(object);This segfaults if object is null, which is obviously impossible in this example.FWIW, GDC doesn't do the rewrite,On structs, it does the rewrite on class instances (boo!).
Jan 29 2011
Further correction. On Sat, 29 Jan 2011 12:09:41 +0000, Bernard Helyer wrote:It checks for null then checks the invariant. I think that's a good compromise, given that an object without an invariant passes the assert.FWIW, GDC doesn't do the rewrite,On structs, it does the rewrite on class instances (boo!).
Jan 29 2011
Bernard Helyer napisa=B3:If I do =20 if (object) { ... } =20 What happens is fairly obvious, and is equivalent to =20 if (object !is null) { } =20 However, if I do =20 auto object =3D new Object(); assert(object); =20 What I expect to happen is =20 assert(object !is null); =20 Just as in the above example. What happens however is the program seg=20 faults. Why? Because it turns out what DMD turns it (silently) into is =20 object.checkInvariants(); // Whatever it's called. =20 This is bad enough, however it gets pants-on-head stupid as *object is=20 not checked for null*. I think the silent rewrite is bad design, but not==20checking for null is so stupid, so obvious to anyone who actually uses=20 the language, I can't believe it's existed for so long. The fact that =20 assert(object); =20 and =20 import std.exception; enforce(object); =20 do different things boggles my mind. One must write =20 assert(object !is null); =20 or =20 assert(!!object); =20 and every day it's like a giant stabbing pain. A stupid wrong headed=20 design that makes my experience with D _worse_. Just expose a method for==20checking the invariant explicitly, and don't do this silent rewrite=20 bullshit. Any chance of getting a change of behaviour? =20 FWIW, GDC doesn't do the rewrite, and SDC (the compiler I'm working on=20 github.com/bhelyer/sdc) won't either.=20http://d.puremagic.com/issues/show_bug.cgi?id=3D796 Vote up ;) --=20 Tomek
Jan 29 2011
On 1/29/11, Tomek Sowi=F1ski <just ask.me> wrote:http://d.puremagic.com/issues/show_bug.cgi?id=3D796 Vote up ;)Wow, that is an old-school bug (2007!). :p I wonder which bug report is the oldest one that is still opened.
Jan 29 2011
Andrej Mitrovic <andrej.mitrovich gmail.com> wrote:On 1/29/11, Tomek Sowi=C5=84ski <just ask.me> wrote:http://d.puremagic.com/issues/show_bug.cgi?id=3D107 -- = Simenhttp://d.puremagic.com/issues/show_bug.cgi?id=3D796 Vote up ;)Wow, that is an old-school bug (2007!). :p I wonder which bug report is the oldest one that is still opened.
Jan 29 2011