digitalmars.D.bugs - [Issue 8786] New: assert does not call "invariant()" function
- d-bugmail puremagic.com (42/42) Oct 09 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8786
- d-bugmail puremagic.com (10/10) Oct 09 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8786
- d-bugmail puremagic.com (15/15) Oct 09 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8786
- d-bugmail puremagic.com (17/24) Oct 09 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8786
- d-bugmail puremagic.com (19/19) Oct 09 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8786
- d-bugmail puremagic.com (11/11) Oct 15 2012 http://d.puremagic.com/issues/show_bug.cgi?id=8786
http://d.puremagic.com/issues/show_bug.cgi?id=8786 Summary: assert does not call "invariant()" function Product: D Version: unspecified Platform: All OS/Version: All Status: NEW Severity: major Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: monarchdodra gmail.com --- Comment #0 from monarchdodra gmail.com 2012-10-09 01:19:41 PDT --- According to http://dlang.org/class.html#Invariant "The invariant can be checked when a class object is the argument to an assert() expression, as: " //---- Date mydate; ... assert(mydate); // check that class Date invariant holds //---- But I get: //---- struct S { invariant(){} } void main() { S s; assert(s); } //---- Error: expression s of type S does not have a boolean value //---- IMO, behavior of assert should be: 1. Check for argument can be cast to bool. If yes, do it. The call should trigger invariant check anyways. 2. Else, call invariant directly. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 09 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8786 bearophile_hugs eml.cc changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bearophile_hugs eml.cc --- Comment #1 from bearophile_hugs eml.cc 2012-10-09 01:44:22 PDT --- This was discussed a lot... -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 09 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8786 Jonathan M Davis <jmdavisProg gmx.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jmdavisProg gmx.com --- Comment #2 from Jonathan M Davis <jmdavisProg gmx.com> 2012-10-09 01:52:20 PDT --- Yes, _class_ object's have their invariant called. You're using a struct. It's cast to bool (like it would be in the condition of an if statement), and your struct doesn't define a cast to bool, so it doesn't work. If you want to check the invariant, then take its address so that you're operating on a pointer to a struct. In that case, it will act the same way that a class does. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 09 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8786 monarchdodra gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Component|DMD |websites Severity|major |trivial --- Comment #3 from monarchdodra gmail.com 2012-10-09 03:24:37 PDT --- (In reply to comment #2)Yes, _class_ object's have their invariant called. You're using a struct. It's cast to bool (like it would be in the condition of an if statement), and your struct doesn't define a cast to bool, so it doesn't work. If you want to check the invariant, then take its address so that you're operating on a pointer to a struct. In that case, it will act the same way that a class does.Thanks for the explanation. I was not present when "this was discussed a lot", and the documentation didn't really make it clear. Anyhow, I took the liberty of updating the documentation. https://github.com/D-Programming-Language/d-programming-language.org/pulls Changing to trivial/website/assigned. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 09 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8786 --- Comment #4 from Jonathan M Davis <jmdavisProg gmx.com> 2012-10-09 10:50:32 PDT --- The behavior of classes was discussed a lot (in particular, it didn't use to check whether the reference was null first, which caused a lot of problems). I'm not sure that the behavior of structs has been discussed much or that it is necessarily entirely desirable (it's certainly not well-documented), but that's how it works right now. Certainly, it makes perfect sense that the struct would be converted to bool. Whether it should also have its invariant called is debatable, but as long as the conversion to bool involves calling a public member function, the invariant will be called anyway. So, the behavior is probably fine. The fact that the invariant is explicitly checked with a pointer to a struct is then essentially the same as what happens with classes, so really, the way that structs currently work with assert is probably the best way to go about it. The main problem is that it's not necessarily intuitive and that it's not properly documented. So, if the docs are updated, then it should be fine. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 09 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8786 monarchdodra gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|ASSIGNED |RESOLVED Resolution| |FIXED --- Comment #5 from monarchdodra gmail.com 2012-10-15 08:08:36 PDT --- Documentation updated. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 15 2012