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: -------

Reply via email to