http://d.puremagic.com/issues/show_bug.cgi?id=3856
Summary: const arguments/instance attributes in conditions/invariants Product: D Version: 2.040 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nob...@puremagic.com ReportedBy: bearophile_h...@eml.cc --- Comment #0 from bearophile_h...@eml.cc 2010-02-26 13:49:46 PST --- Currently preconditions and postconditions (D contract based programming) can modify input arguments, this prints [0, 2]: import std.stdio: writeln; void foo(int[] arr) out { arr[0] = 0; } body {} void main() { auto a = [1, 2]; foo(a); writeln(a); } But I think it's better if arguments are seen as const inside preconditions and postconditions. Because modifying them alters too much the program behaviour between release and not release builds. And I think it's better if instance/static attributes are seen as const inside class/struct invariants: 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); } That code prints different things if compiled in release or not release mode. ---------------------- A small syntactic related problem: This is correct syntax: out{} out(return){} invariant(){} This is not valid syntax: out(){} invariant{} I suggest to make such syntax more uniform to help the programmer. A permissive solution is to allow the following syntax too: out(){} invariant{} Otherwise the syntax: invariant(){} Can become, for symmetry with "out": invariant{} -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------