Thread overview
[Issue 8786] New: assert does not call "invariant()" function
Oct 09, 2012
Jonathan M Davis
Oct 09, 2012
Jonathan M Davis
October 09, 2012
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: -------
October 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: -------
October 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: -------
October 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: -------
October 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: -------
October 15, 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: -------