[Issue 20805] New: C++ mangling mismatch with templates and namespaces
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri May 8 11:02:39 UTC 2020
https://issues.dlang.org/show_bug.cgi?id=20805
Issue ID: 20805
Summary: C++ mangling mismatch with templates and namespaces
Product: D
Version: D2
Hardware: x86_64
OS: Windows
Status: NEW
Severity: major
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: andrej.mitrovich at gmail.com
Using DMD v2.091.1.
Take these two files:
cpp.cpp
-----
#include <vector>
static const uint32_t XDR_MAX_LEN = 0xfffffffc;
namespace xdr
{
template<typename T, uint32_t N = XDR_MAX_LEN>
struct xvector
{
};
}
template<typename T, typename VectorT>
void push_back(VectorT& this_, T& value)
{
}
#define PUSHBACKINST1(T) template void push_back<T, xdr::xvector<T>
>(xdr::xvector<T>&, T&);
PUSHBACKINST1(xdr::xvector<unsigned char>)
-----
and d.d:
-----
import core.stdc.stdint;
extern (D) static immutable XDR_MAX_LEN = 0xffff_fffc;
extern (C++, `xdr`)
struct xvector(T, uint32_t N = XDR_MAX_LEN)
{
}
extern (C++)
public void push_back(T, VectorT) (ref VectorT this_, ref T value);
void main ()
{
xvector!(xvector!ubyte) vec;
xvector!ubyte val;
vec.push_back(val);
}
-----
$ cl /JMC /MP /GS /c /Zc:forScope /std:c++14 cpp.cpp
$ dmd -m64 cpp.obj d.d
d.obj : error LNK2019: unresolved external symbol "void __cdecl
push_back<struct xdr::xvector<unsigned char,4294967292>,struct
xdr::xvector<struct xdr::xvector<unsigned char,4294967292>,4294967292> >(struct
xdr::xvector<struct xdr::xvector<unsigned char,4294967292>,4294967292> &,struct
xvector<unsigned char,4294967292>::xvector<unsigned char,4294967292> &)"
(??$push_back at U?$xvector at E$0PPPPPPPM@@xdr@@U?$xvector at U?$xvector at E$0PPPPPPPM@@xdr@@$0PPPPPPPM@@2@@@YAXAEAU?$xvector at U?$xvector at E$0PPPPPPPM@@xdr@@$0PPPPPPPM@@xdr@@AEAU?$xvector at E$0PPPPPPPM@@2@@Z)
referenced in function _Dmain
cpp.exe : fatal error LNK1120: 1 unresolved externals
The actual exported symbol is:
void __cdecl push_back<struct xdr::xvector<unsigned char,4294967292>,struct
xdr::xvector<struct xdr::xvector<unsigned char,4294967292>,4294967292> >(struct
xdr::xvector<struct xdr::xvector<unsigned char,4294967292>,4294967292> &,struct
xdr::xvector<unsigned char,4294967292> &)"
(??$push_back at U?$xvector at E$0PPPPPPPM@@xdr@@U?$xvector at U?$xvector at E$0PPPPPPPM@@xdr@@$0PPPPPPPM@@2@@@YAXAEAU?$xvector at U?$xvector at E$0PPPPPPPM@@xdr@@$0PPPPPPPM@@xdr@@AEAU?$xvector at E$0PPPPPPPM@@1@@Z)
The difference is at the very end. @2@@Z in D vs @1@@Z in C++.
It seems the namespace is not mangled properly.
Demangled D:
void __cdecl push_back<struct xdr::xvector<unsigned char,-4>,struct
xdr::xvector<struct xdr::xvector<unsigned char,-4>,-4> >(struct
xdr::xvector<struct xdr::xvector<unsigned char,-4>,-4> & __ptr64,struct
xvector<unsigned char,-4>::xvector<unsigned char,-4> & __ptr64)
Demangled C++:
void __cdecl push_back<struct xdr::xvector<unsigned char,-4>,struct
xdr::xvector<struct xdr::xvector<unsigned char,-4>,-4> >(struct
xdr::xvector<struct xdr::xvector<unsigned char,-4>,-4> & __ptr64,struct
xdr::xvector<unsigned char,-4> & __ptr64)
Notice the missing 'xdr::' close to the end.
--
More information about the Digitalmars-d-bugs
mailing list