On 10/12/2016 10:49 PM, mikey wrote:
import std.exception;
interface Widthy {
@property inout(int) width() inout;
@property void width(int width) in { enforce(width < 0); }
}
class Test : Widthy {
private:
int _w;
public:
@property inout(int) width() inout { return _w; }
@property void width(int width) in { enforce(width < 0); }
body {
_w = width;
}
}
void main() {
import std.stdio;
auto t = new Test;
t.width = -1;
writeln("width: ", t.width);
// width: -1
// doesn't look right
}
The contract of the interface seems to see a wrong value:
----
import std.stdio;
interface Widthy {
void width(int width)
in {
writeln(width); /* prints "2" */
assert(width > 0);
}
}
class Test : Widthy {
void width(int width) in { assert(width > 0); } body {}
}
void main() {
auto t = new Test;
t.width(-1);
}
----
I haven't checked closely, but there's issue 15984 which is titled
"Interface contracts retrieve garbage instead of parameters". That's
probably it. It's a regression in 2.071.
https://issues.dlang.org/show_bug.cgi?id=15984