Generally a program can produce different outputs between release and not
release mode, but I always like to minimize the probability of this.
Two examples:
---------------
import std.stdio: writeln;
void foo(int[] arr)
out { arr[0] = 0; }
body {}
void main() {
auto a = [1, 2];
foo(a);
writeln(a);
}
---------------
import std.stdio: writeln;
struct Foo {
int x;
invariant() { this.x -= 10; }
void incr() { x++; }
}
void main() {
Foo f;
writeln(f.x);
f.incr();
writeln(f.x);
f.incr();
writeln(f.x);
}
---------------
The problem can be reduced if input arguments are seen as const inside pre/post
conditions, and attributes are seen as const inside class/struct invariants.
This is what I have asked:
http://d.puremagic.com/issues/show_bug.cgi?id=3856
But there's an alternative solution, to let the compiler accept only pure
pre/post conditions (and invariants that can only read attributes and write
nothing), but I am not sure if this can be a bit too much restrictive (can you
invent situations where this is too much restrictive?), so for now I have asked
just for the less restrictive thing.
Bye,
bearophile