You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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]); // __vptrwriteln((cast(size_t **)(a))[1]); // __monitorwriteln((cast(size_t **)(a))[2]); // ywriteln((cast(size_t **)(a))[3]); // outerwriteln((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 dereferencedstatic if (0) { static assert(b.foo() == 3);}
}
// EOF
The text was updated successfully, but these errors were encountered:
mfx reported this on 2015-01-22T19:16:24Z
Transferred from https://issues.dlang.org/show_bug.cgi?id=14030
Description
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); } } // EOFThe text was updated successfully, but these errors were encountered: