http://d.puremagic.com/issues/show_bug.cgi?id=3634
Summary: return value not passed to out contracts of private methods Product: D Version: 2.036 Platform: Other OS/Version: Linux Status: NEW Severity: major Priority: P2 Component: DMD AssignedTo: nob...@puremagic.com ReportedBy: bary...@smp.if.uj.edu.pl --- Comment #0 from Witold Baryluk <bary...@smp.if.uj.edu.pl> 2009-12-18 22:37:44 PST --- This code failes, but it should pass. class A { this() { x_ = 10; } private: uint x_; uint x() out(ret) { assert(ret == 10); // fails // line 10 assert(ret == x_); // fails } body { return x_; } } import std.stdio; void main() { auto a = new A(); writefln("%d", a.x()); } $ dmd2 -debug a.d; ./a core.exception.asserter...@t(10): Assertion failure $ When I change x() method to 'public' problems dissaper. Here is dissambled code assume CS:.text._D1t1A1xMFZk _D1t1A1xMFZk: push EBP mov EBP,ESP sub ESP,0Ch add EAX,8 mov ECX,[EAX] mov -8[EBP],ECX mov -0Ch[EBP],EAX mov EAX,0Ah call near ptr _d1t8__assertf...@pc32 mov EDX,-0Ch[EBP] cmp dword ptr [EDX],0 je L2D mov EAX,0Bh call near ptr _d1t8__assertf...@pc32 L2D: mov EAX,-8[EBP] leave ret nop nop .text._D1t1A1xMFZk ends Also without "-debug" switch the same code is generated. If i comment a assert statments (or don't use ret), method properly returns value to callee. In release mode it works correclty (but contracts are called): .text._D1t1A1xMFZk segment assume CS:.text._D1t1A1xMFZk _D1t1A1xMFZk: push EBP mov EBP,ESP sub ESP,4 mov EAX,8[EAX] leave ret nop .text._D1t1A1xMFZk ends -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------