https://issues.dlang.org/show_bug.cgi?id=21690
Issue ID: 21690 Summary: Unable to dynamic cast extern(C++) classes Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: critical Priority: P1 Component: dmd Assignee: nob...@puremagic.com Reporter: thomas.bock...@gmail.com Since 2.067.1, the program below outputs: D cast was dynamic. C++ cast was static. The extern(C++) class casts need to be dynamic, just like the extern(D) casts: /////////////////////////////////////////////// module app; import std.stdio; @safe: extern(D) { abstract class DA { char foo(); } class DB : DA { override char foo() { return 'B'; } } class DC : DA { override char foo() { return 'C'; } } } extern(C++) { abstract class CA { char foo(); } class CB : CA { override char foo() { return 'b'; } } class CC : CA { override char foo() { return 'c'; } } } void main() { DB db = new DB; DA da = db; DC dc = cast(DC) da; writeln((dc is null)? "D cast was dynamic." : "D cast was static."); CB cb = new CB; CA ca = cb; CC cc = cast(CC) ca; writeln((cc is null)? "C++ cast was dynamic." : "C++ cast was static."); return; } /////////////////////////////////////////////// This is a critical bug, as the results of accessing an incorrectly typed class object could, in the general case, be almost anything, including memory corruption. --