www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 14030] New: Incorrect initialization of nested classes

https://issues.dlang.org/show_bug.cgi?id=14030

          Issue ID: 14030
           Summary: Incorrect initialization of nested classes
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: DMD
          Assignee: nobody puremagic.com
          Reporter: markus oberhumer.com

It seems that "outer" is not correctly set for nested classes
when using static const objects.

Please see "NULL" in the code below.

// dmd 2.066.1

class Outer {
    size_t x = 1;
    final class Inner {
        size_t y = 2;
        auto foo() const { return x + y; }
        // <== info: here is a ref "Outer outer;"
    }
}

void main() {
    import std.stdio: writeln;

           const a = (new Outer).new Inner;
    static const b = (new Outer).new Inner;

    assert(a.foo() == 3);

    writeln((cast(size_t **)(a))[0]);   // __vptr
    writeln((cast(size_t **)(a))[1]);   // __monitor
    writeln((cast(size_t **)(a))[2]);   // y
    writeln((cast(size_t **)(a))[3]);   // outer

    writeln((cast(size_t **)(b))[0]);
    writeln((cast(size_t **)(b))[1]);
    writeln((cast(size_t **)(b))[2]);
    writeln((cast(size_t **)(b))[3]);   // => NULL !

    assert(b.foo() == 3);               // runtime crash here

    // enable this for error message:
    //   Error: class 'this.this' is null and cannot be dereferenced
    static if (0) {
        static assert(b.foo() == 3);
    }
}

// EOF

--
Jan 22 2015