digitalmars.D.bugs - [Issue 3578] New: Impossible to run a struct invariant using assert(s)
- d-bugmail puremagic.com Dec 05 2009
- d-bugmail puremagic.com Jun 21 2010
- d-bugmail puremagic.com Oct 16 2010
- d-bugmail puremagic.com Oct 16 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3578 Summary: Impossible to run a struct invariant using assert(s) Product: D Version: 1.041 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: llucax gmail.com --- Comment #0 from Leandro Lucarella <llucax gmail.com> 2009-12-05 08:24:54 PST --- This fails to compile (with -unittest): --- struct S { invariant() { assert (false); } unittest { S s; assert (s); } } --- With this error message: inv.d(3): Error: expression s of type S does not have a boolean value With both DMD 1 and 2 (tested with DMD 1.041 and DMD 2.037. Changing struct to class compiles fine (and dumps a core if you run it, of course ;). Thes specs are not clear on this in both D1 and D2. Invariant is only mentioned in structs, but I guess it's more likely to think that the description of class invariant apply to structs too, so I guess this should be supported in both D1 and D2. If it's a change to big to make it in D1, I think the specs should be updated to clarify the differences between struct and class invariants. In D2 I don't see why the language should not be updated to support this, since there is no other way to trigger an invariant check (and, for example, invariant is not executed when a struct is constructed or when using alias this, I think). -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 05 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3578 Leandro Lucarella <llucax gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bearophile_hugs eml.cc --- Comment #1 from Leandro Lucarella <llucax gmail.com> 2010-06-21 17:44:13 PDT --- *** Issue 4326 has been marked as a duplicate of this issue. *** -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jun 21 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3578 Shin Fujishiro <rsinfu gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rsinfu gmail.com --- Comment #2 from Shin Fujishiro <rsinfu gmail.com> 2010-10-16 12:02:06 PDT --- It's undocumented, but struct invariants are fired on pointers: -------------------- struct S { invariant() { assert(0); } // (3) } void main() { S s; assert(&s); } -------------------- % dmd -run test.d core.exception.AssertError test(3): Assertion failure -------------------- Though it's non-intuitive, I find it reasonable considering that structs can define opCast to bool. assert(s) would be ambiguous if s had both invariant and opCast!bool. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 16 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3578 --- Comment #3 from Leandro Lucarella <llucax gmail.com> 2010-10-16 16:06:59 PDT --- (In reply to comment #2)It's undocumented, but struct invariants are fired on pointers: -------------------- struct S { invariant() { assert(0); } // (3) } void main() { S s; assert(&s); } -------------------- % dmd -run test.d core.exception.AssertError test(3): Assertion failure -------------------- Though it's non-intuitive, I find it reasonable considering that structs can define opCast to bool. assert(s) would be ambiguous if s had both invariant and opCast!bool.
I never expected that, but it makes sense as you mention. I guess this behavior should be documented in the specs. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 16 2010









d-bugmail puremagic.com 