digitalmars.D.bugs - [Issue 14030] New: Incorrect initialization of nested classes
- via Digitalmars-d-bugs (47/47) Jan 22 2015 https://issues.dlang.org/show_bug.cgi?id=14030
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