Calypso

Calypso is an experimental LDC fork that offers alternative interfacing to C++ based on Clang instead of implementing it "from scratch" as currently being done in the official compiler. It attempts to widen and facilitate C++ support while minimizing intrusions into the code of the DMD frontend and LDC.

It is designed so that when the day comes splitting Calypso from LDC will be easy and Calypso could then exist as a LDC plugin in the form of a shared library.

Frontend changes

Although frontend (DMD) modifications are kept to a minimum, many small changes were still needed. The most numerous are hooks (new virtual methods) here and there, and existing methods made virtual enabling Calypso to do what's specific to C++ symbols and types.

Class values were added to the type system, C++ classes being mapped to value types to avoid value <-> reference uncertainties (if polymorphic C++ classes were mapped to class references, a #define or a new method could change whether a type is value or reference).

Additionally, a few new language features that were deemed essential for reducing code verbosity and solving issues caused by semantics differences between C++ and D in a not too complicated way were implemented.

Current status

Importing and using C++ libraries is fully implemented, most C++1y features are supported. However due to sometimes subtle differences between D and C++, to remaining bugs, or because importing a template-heavy library can be very testing for the DMD frontend (resulting in forward referencing errors), hitting a bug that makes the semantic pass fail is still a common occurrence for untested libraries. They are most of the time quickly fixable after investigating.

Calypso has been tested primarily on Linux. OS X has been barely tested but some examples have been reported to work, and MSVC support has reached an usable state (tested on 14.0/2015) but still lacks exception handling.

This is by no means a exhaustive list of working libraries, only the ones which have been tested by the author and used for personal projects. Others have been reported to work in basic examples (Boost, GDAL, FastFlow).

Another smaller issue is that Qt Designer for Widgets' .ui files are translated by uic into C++ headers. Although the generated C++ header could be loaded by Calypso, this makes implementing custom widgets in D impossible.

To solve these two problems, a moc package that replicates the C++ MOC's functionality entirely with D's metaprogramming capabilities and a D generator for uic were created :

Missing features

Register the destructor of C++ classes and structs while allocating a C++ class through the GC (as is being done for D structs)

MSVC exception handling

How to help

More testing is needed. If your code fails to compile and you don't intend to fix the code of Calypso yourself a good way to help is to open a Github issue, copy the failing code and provide the name and version of the library used, so investigating can begin right away.