www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [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



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