www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Mixin override function in a extern C++ class leads to possible bug?

reply Zoadian <no no.no> writes:
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
parent Zoadian <no no.no> writes:
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