April 07, 2013 [Issue 9897] New: Wrong context for nested class inside virtual or final function with contract which uses `this` | ||||
---|---|---|---|---|
| ||||
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 --- Comment #0 from Denis Shelomovskij <verylonglogin.reg@gmail.com> 2013-04-07 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: ------- |
Copyright © 1999-2021 by the D Language Foundation