[Issue 3856] New: const arguments/instance attributes in conditions/invariants
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Feb 26 13:49:50 PST 2010
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: nobody at puremagic.com
ReportedBy: bearophile_hugs at eml.cc
--- Comment #0 from bearophile_hugs at 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: -------
More information about the Digitalmars-d-bugs
mailing list