In D it's possible to use pragma(mangle) on a function to set the name that will actually end up in the binary. This is useful if you need to link to a C function that uses the same name as a keyword in D.

I think we need the same thing for types as well. This is important when binding to C++ and Objective-C.

For C++ it's due the the types are mangled as part of function signatures. Other than conflicting D keywords, it's also important for another reason. In C, the name of structs live in their own namespace, making it possible to have a struct and a function with the same name. Since you always need to use "struct <name>" in C when referring to the type it works.

This caused a problem [1]. There's a function called "stat", which also accepts an argument of the type "stat". In D, the struct is declared "stat_t" to avoid the conflict with the function. When using C functions this works perfectly fine since no mangling is used. But when using a C++ function taking an argument of the type "stat_t" this will generate the wrong mangling since it's expected to be "stat" on the C++ side.

For Objective-C a similar scenario can occur. Because in Objective-C protocols (what we call interfaces in D) and classes live in different namespaces. In Objective-C there's a root class called "Object" just as in D. But in Objective-C this class also conforms to a protocol called "Object". For this to work properly from the D side, one needs to be renamed in the D code and use pragma(mangle) to set the actual name that would end up in the binary.

I suggest that we add support for using pragma(mangle) on types as well. Thoughts?

I have already implemented the support for Objective-C classes in an old branch several years ago.

[1] https://issues.dlang.org/show_bug.cgi?id=16650

--
/Jacob Carlborg

Reply via email to