Package import order with extern(C++) classes and std.container.array failure

cc cc at nevernet.com
Tue Apr 6 09:33:32 UTC 2021


Just encountered this compilation failure in DMD winx64 2.096, 
which previously worked in 2.095 and prior versions.  Just 
wondering if it's a bug, or a new issue to keep in mind when 
importing modules?  Sorry for the complex nature of this scenario 
but I'll try to keep it as simple as possible.

Given the following 4-file setup:

// main.d
import cream;
void main() {}

// cream/package.d
module cream;
public import cream.dcream;
public import cream.callbacks;

// cream/callbacks.d
module cream.callbacks;
import cream;
extern(C++) class CallbackBase {}

// cream/dcream.d
module cream.dcream;
import cream;
import std.container.array;
Array!CallbackBase callbackTracker;


Compilation fails with the following error:
C:\D\dmd2\windows\bin\..\..\src\phobos\std\container\array.d(519): Error: incompatible types for array comparison: `const(CallbackBase[])` and `const(CallbackBase[])`
C:\D\dmd2\windows\bin\..\..\src\phobos\std\container\array.d(189): Error: template instance `std.container.array.RangeT!(const(Array!(CallbackBase)))` error instantiating
C:\D\dmd2\windows\bin\..\..\src\phobos\std\container\array.d(528):        instantiated from here: `RangeT!(Array!(CallbackBase))`
cream\dcream.d(4):        instantiated from here: 
`Array!(CallbackBase)`

It seems I can fix this by changing the order the other modules 
are imported in package.d like so:
// cream/package.d
module cream;
public import cream.callbacks;
public import cream.dcream;

I'm curious why this worked in prior dmd versions, and if it's 
something I'll need to worry about going forward when creating 
complex multi-file modules.


More information about the Digitalmars-d-learn mailing list