Bug 4648 – "In" contracts in interfaces missbehaving

Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2010-08-15T12:59:00Z
Last change time
2012-01-25T12:41:12Z
Assigned to
nobody
Creator
andrej.mitrovich

Comments

Comment #0 by andrej.mitrovich — 2010-08-15T12:59:13Z
Code: interface I { int foo(int i) in { writeln(i); assert(i == 4); } } class Base : I { int foo(int i) { return i; } } import std.stdio; void main() { auto b = new Base; b.foo(4); } The writeln will output garbage, ex: 1630368629 core.exception.AssertError@test(83): Assertion failure You can remove the writeln, but the assert still fails. I'm using the same syntax as defined in the docs: http://www.digitalmars.com/d/2.0/interface.html
Comment #1 by viritrilbia+d — 2011-06-04T20:37:50Z
'Out' contracts in interfaces seem to have the same problem: the arguments passed to the function get replaced by garbage. On my system (DMD v2.053 on Ubuntu) the precise value of the garbage appears to depend on what data members exist in the class which implements the interface. E.g. Andrej's code writeln outputs "0" for me, but if I add "int x;" to the definition of Base, it outputs instead "135115244".
Comment #2 by truesmiler — 2011-06-05T09:02:54Z
Same problem, when overriding contracted function (D 2.053, windows and ubutnu). So, it seems to be about all the contract inheritance. class A { void f(int a) in { writeln(a); } out { writeln(a); } body {} } class B: A { override void f(int a) { writeln(a); } } void main() { A a = new B; a.f(42); // prints <garbage>, 42, <garbage> }
Comment #3 by bugzilla — 2012-01-25T12:41:12Z
*** This issue has been marked as a duplicate of issue 7335 ***