digitalmars.D.bugs - [Issue 9897] New: Wrong context for nested class inside virtual or final function with contract which uses `this`
- d-bugmail puremagic.com (76/76) Apr 07 2013 http://d.puremagic.com/issues/show_bug.cgi?id=9897
http://d.puremagic.com/issues/show_bug.cgi?id=9897 Summary: Wrong context for nested class inside virtual or final function with contract which uses `this` Product: D Version: D2 Platform: All OS/Version: All Status: NEW Keywords: contracts, wrong-code Severity: major Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: verylonglogin.reg gmail.com 17:49:19 MSD --- --- import std.stdio; abstract class B { abstract void g(); } char* chPtr; B b; class C { char ch; final void f() in { assert(ch != 7); } body { class D: B { this() { writefln("D: %s", cast(void*[]) (cast(void*) this)[0 .. __traits(classInstanceSize, D)]); writefln("&c: %8s in C.f.D.this", &ch - ch.offsetof); assert(&ch == chPtr); } override void g() { writefln("&c: %8s in C.f.D.g", &ch - ch.offsetof); assert(&ch == chPtr); // Line 31 } } b = new D; } } void main() { auto c = new C(); chPtr = &c.ch; writefln("&c: %8s in main", cast(void*) c); c.f(); b.g(); } --- Output: --- &c: A11F90 in main D: [43F1E0, null, 12FD44] &c: A11F90 in C.f.D.this &c: 440150 in C.f.D.g <-- wrong c`'s address <Assertion failure at line 31> --- If `assert(ch != 7);` is replaced with `assert(chPtr);` or if `f` is `package`, `private` or templated it works fine: --- &c: A11F90 in main D: [43F1E0, null, A11F90] <-- now the last field refers to `c` &c: A11F90 in C.f.D.this &c: A11F90 in C.f.D.g --- -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Apr 07 2013