Shortcut evaluation for hierarchy of in contracts

Robert Jacques sandford at jhu.edu
Fri Jul 1 16:32:08 PDT 2011


On Fri, 01 Jul 2011 02:39:29 -0400, Jens Mueller <jens.k.mueller at gmx.de>  
wrote:
> Robert Jacques wrote:
>> On Thu, 30 Jun 2011 06:42:57 -0400, Jens Mueller
>> <jens.k.mueller at gmx.de> wrote:
>>
>> >bearophile wrote:
>> >>Jens Mueller:
>> >>
>> >>> unittest {
>> >>>     class Base {
>> >>>         void foo(uint i)
>> >>>             in { assert(i <= 10); }
>> >>>         body { }
>> >>>     }
>> >>>
>> >>>     class Sub : Base {
>> >>>         override void foo(uint i)
>> >>>             in { assert(i <= 5); } // fails to require less
>> >>but I won't know
>> >>>         body
>> >>>         {
>> >>>             assert(i <= 5); // fails here because in contract
>> >>wasn't checked
>> >>>         }
>> >>>     }
>> >>>
>> >>>     auto s = new Sub;
>> >>>     //s.foo(10); // fails as expected
>> >>>     s.foo(7); // due to shortcut evaluation of in contracts
>> >>this call passes all contracts
>> >>> }
>> >>
>> >>I think it's a DMD bug, fit for Bugzilla if not already present.
>> >
>> >The shortcut evaluation is specified in TDPL. That's why I assume the
>> >behavior is intended.
>> >
>> >Jens
>>
>> A subclass must be able to handle all the inputs the base class
>> accepts, otherwise it isn't true polymorphism anymore. Not being
>> able to use Sub where Base is expected, and maybe only Base was
>> tested, can lead to major bugs.
>
> So you agree that the current behavior is error-prone?

No. I think the current behavior is correct. In fact, if anything, D  
shouldn't allow you to define an in contract on any override method. A Sub  
is a Base and therefore must be able to handle all inputs that are valid  
for a Base.


More information about the Digitalmars-d mailing list