[Issue 22550] New: tail const C++ class not usable on Windows

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Nov 27 21:42:57 UTC 2021


https://issues.dlang.org/show_bug.cgi?id=22550

          Issue ID: 22550
           Summary: tail const C++ class not usable on Windows
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: tim.dlang at t-online.de

Consider the following C++ and D code:

//////////// testtailconstcpp.cpp ////////////////
class C
{
public:
    virtual ~C();
};

C::~C()
{
}

void test(const C *c)
{
}
////////////// testtailconstd.d //////////////////
extern(C++) class C
{
    ~this();
}

extern(C++) void test(const C c);

void main()
{
    test(new C);
}
//////////////////////////////////////////////////

The code compiles and links successfully on Linux, but fails to link on
Windows. The following commands are used for Windows with Visual C++:

cl -c testtailconstcpp.cpp
dmd testtailconstd.d testtailconstcpp.obj

It results in the following error message:
testtailconstd.obj : error LNK2019: unresolved external symbol "void __cdecl
test(class C const * const)" (?test@@YAXQEBVC@@@Z) referenced in function
_Dmain
  Hint on symbols that are defined and could potentially match:
    "void __cdecl test(class C const *)" (?test@@YAXPEBVC@@@Z)
testtailconstd.exe : fatal error LNK1120: 1 unresolved externals
Error: linker exited with status 1120

It does not work, because D mangles the parameter type as full const, while the
C++ function uses head const. The mangling could simply be changed, but that
would break code, which really needs full const. It works on Linux, because the
outer const is already ignored for the mangling.

A workaround is to use pragma(mangle, ...).

--


More information about the Digitalmars-d-bugs mailing list