assert and enforce both compiled out with -release
kdevel
kdevel at vogtner.de
Sat Jan 27 17:12:25 UTC 2018
On Saturday, 27 January 2018 at 16:19:30 UTC, Jonathan M Davis
wrote:
> On Saturday, January 27, 2018 14:59:50 kdevel via
> Digitalmars-d-learn wrote:
>> >>> https://github.com/dlang/phobos/blob/master/std/exception.d
>> >>
>> >> "Use $(D assert) in contracts." is still in there.
>> >
>> > What's wrong with that? What documentation is trying to say
>> > is "do not use enforce in contracts; use assert in
>> > contracts" and that's exactly the idea.
>>
>> I can't see a problem which would be solved by following this
>> advice. It distracts the reader (me) from gettin his (my) work
>> done. If I compile not for release both, enforce and assert,
>> are in effect. If I compile for release both, enforce and
>> assert, are disabled. So by replacing enforce with assert I
>> gain nothing.
>
> No, enforce is _not_ disabled with -release. e.g.
That's not my point.
> void foo(int i)
> {
> enforce(i > 42);
> }
>
> void main()
> {
> foo(0);
> }
This is a different case.
> will throw an exception even when you compile with -release.
> The problem is that you're using enforce inside a contract
> instead of inside the function's body.
This is not a problem, because this is perfectly legal. The
problem is the wording of this phrase on the docs:
| Also, do not use enforce inside of contracts (i.e. inside of in
and out blocks
| and invariants), because they will be compiled out when
compiling with
| -release. Use assert in contracts.
Using assert *IN* contracts in -release mode is equally pointless.
> Contracts are specifically for asserting pre and post
> conditions. It is expected that they only be used for
> assertions or for code which is going to be run in preparation
> for running an assertion. They are _not_ for code which is
> intended to be part of the final program, and they are compiled
> out with -release, just like assertions are compiled out
> elsewhere in the code. As such, any code in a contract - be it
> an assertion, a call to enforce, or any arbitarily complex
> piece of code - will not be in the final program.
Then please explain the meaning of the sentence
Use assert in contracts.
in this context:
| Also, do not use enforce inside of contracts (i.e. inside of in
and out blocks
| and invariants), because they will be compiled out when
compiling with
| -release. Use assert in contracts.
to me. IMHO this advice is pointless.
> Anything that you want in your final program should not be in a
> contract. If you want to use exceptions - be it with enforce or
> with an if statement and explicitly throwing - then don't put
> them in any contracts. They _will_ get compiled out. As such,
> it makes no sense to use enforce in a contract. It should go in
> the function body.
Then please explain to me, in which respect the advice to "Use
assert[s] in contracs" makes sense if the contracts are to be
compiled out. I don't get it.
More information about the Digitalmars-d-learn
mailing list