digitalmars.D - Mixin override function in a extern C++ class leads to possible bug?
Hi, am I missing something or is this a bug? I'm trying to load a C++ DLL (a vst3). and most of it works perfectly, but i've got a case where the order of two mixins suddenly matters, but they mixin override functions. looks like somehow the vtable gets screwed up. code is minified to explain whats going on, i can provide a complete compilabe project if nessecary. am i correct that this is a bug and the order of the two mixins shouldn't matter? ``` extern (C++) class HostMessage : IMessage { public: // somehow the order of the two mixins matters mixin IMPLEMENT_REFCOUNT; mixin QUERY_INTERFACE!(FUnknown, IMessage); } mixin template IMPLEMENT_REFCOUNT() { override uint addRef() { return 1; } override uint release() { return 1; } } mixin template QUERY_INTERFACE(Interfaces...) { override tresult queryInterface (ref const TUID _iid, void** obj) { return 1; } } interface IMessage : FUnknown { public: nothrow: // nogc: /** Returns the message ID (for example "TextMessage"). */ FIDString getMessageID(); /** Sets a message ID (for example "TextMessage"). */ void setMessageID(FIDString id /*in*/); /** Returns the attribute list associated to the message. */ IAttributeList getAttributes(); __gshared immutable TUID iid = INLINE_UID(0x936F033B, 0xC6C047DB, 0xBB0882F8, 0x13C1E613); } interface FUnknown : IUnknown { __gshared immutable TUID iid = INLINE_UID(0x00000000, 0x00000000, 0xC0000000, 0x00000046); } interface IUnknown { tresult queryInterface(ref const(TUID) _iid, void** obj); uint addRef(); uint release(); } ```
Apr 03 2023
On Monday, 3 April 2023 at 11:24:16 UTC, Zoadian wrote: ok, i think i found the real problem: somehow the compiler treats my interface IUnknown specially. i've filed a bug report: https://issues.dlang.org/show_bug.cgi?id=23819 https://run.dlang.io/is/YuouXd vs https://run.dlang.io/is/nxRwN0 and this leads to to compiler messing up my code without any warning.
Apr 03 2023