#dbugfix 17592

Adam D. Ruppe destructionator at gmail.com
Thu Mar 22 02:35:41 UTC 2018


On Thursday, 22 March 2018 at 01:55:48 UTC, 12345swordy wrote:
> Are you suggesting that we need runtime version of system/user 
> attributes?

We already have that in a sense - InvalidMemoryOperationError is 
thrown if you try to GC allocate from inside a GC destructor. The 
attributes are supposed to render such runtime errors impossible, 
catching them at compile time instead.

>> All classes are dynamic types
>
> I do not see it anywhere in the dlang specification that 
> supports your claim.
> https://dlang.org/spec/class.html

This is the reason why all D classes have a vtable attached (with 
attached runtime type info). *All* class-specific features are 
centered around this - casts use rtti, inheritance and interfaces 
use the vtable. It is the reason why D classes are reference 
types - otherwise, when you substitute it, you'd risk slicing the 
object.

If you took the dynamic aspect out of classes, you'd have an 
entirely different animal... the thing D calls a "struct".

> Why can't it produce a warning message regarding implied 
> classes conversion if it detects mismatch attributes?

The entire purpose of OOP inheritance existing is the 
substitution principle, that subclasses can take the place of 
base classes transparently. This is an either-or situation: if we 
want to keep the current definition of classes, bug 17592 MUST be 
closed as "wontfix" as it is by design to maintain 
substitutiability.

If we want to fix #17592, we MUST redefine the language's 
definition of class destructors to follow inheritance-style rules 
on matching attribute (even if they are actually implemented as a 
chain), again to guarantee substitutability is not broken.

There's no middle ground possible.


More information about the Digitalmars-d mailing list