On Wednesday, 21 March 2018 at 14:04:58 UTC, Adam D. Ruppe wrote:
On Wednesday, 21 March 2018 at 13:39:28 UTC, 12345swordy wrote:
You can simply check the .dtor symbols at compile time to see
if every .dtor symbol from child to root have a .dtor that
have the @nogc attribute
In Simen's example, the child information is not available at
compile time. This line here:
A a = new B();
discards the static type. The compiler could probably cheat and
figure it out anyway in this example, but suppose:
---
class A {
@nogc ~this() {}
}
class B : A {
~this() {}
}
class C : A {
@nogc ~this() {}
}
A build(string name) {
if(name == "B") return new B();
else return new C();
}
void main() {
A a = build(readln());
destroy(a);
}
---
This is very clearly a runtime decision: whether it is B or C
is determined by user input. But B's dtor is not @nogc... and
there's thus no way to tell for sure if destroy(a) is or not,
since it will call the child class based on the runtime
decision.
so it is impossible for the compiler to know which child class
is actually called until runtime... too late for a compile-time
nogc check.
That seems to be it's own separate problem, as it involves
generating dynamic types at run-time, which it needs run-time
equivalent of attribute checking. My example assumes that the
classes created are static types not dynamic types. Besides I do
not like implied conversions when it comes classes, as I believe
it is a horrible idea.