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
Comment #1 by robert.schadek — 2024-12-13T18:39:15Z