blob: 30291a35e626c2ea1acd329c15663b29b8a74f3c [file] [log] [blame]
version (CppRuntime_Clang) version = CppMangle_Itanium;
version (CppRuntime_Gcc) version = CppMangle_Itanium;
version (CppRuntime_Sun) version = CppMangle_Itanium;
template ScopeClass(C , string name = C.stringof)
//if (is(C == class) && __traits(getLinkage, C) == "C++")
{
//enum name = C.stringof;
enum ns = __traits(getCppNamespaces,C);
extern(C++, class)
{
extern(C++,(ns))
{
pragma(mangle, C, name)
struct ScopeClass
{
char[__traits(classInstanceSize, C)] buffer;
//... all the things ...
}
}
}
}
// Basic tests
extern(C++)
{
class MyClassA {}
void funa(ScopeClass!MyClassA); // mangles MyClass
void funb(const ScopeClass!MyClassA); // mangles const MyClass
void func(ref ScopeClass!MyClassA); // mangles MyClass&
void fund(ref const ScopeClass!MyClassA); // mangles const MyClass&
void fune(const(ScopeClass!MyClassA)*);
}
version (CppMangle_Itanium)
{
static assert(funa.mangleof == "_Z4funa8MyClassA");
static assert(funb.mangleof == "_Z4funb8MyClassA");
static assert(func.mangleof == "_Z4funcR8MyClassA");
static assert(fund.mangleof == "_Z4fundRK8MyClassA");
static assert(fune.mangleof == "_Z4funePK8MyClassA");
}
else version (CppRuntime_Microsoft)
{
static assert(funa.mangleof == "?funa@@YAXVMyClassA@@@Z");
static assert(funb.mangleof == "?funb@@YAXVMyClassA@@@Z");
static if (size_t.sizeof == ulong.sizeof)
{
static assert(func.mangleof == "?func@@YAXAEAVMyClassA@@@Z");
static assert(fund.mangleof == "?fund@@YAXAEBVMyClassA@@@Z");
static assert(fune.mangleof == "?fune@@YAXPEBVMyClassA@@@Z");
}
else
{
static assert(func.mangleof == "?func@@YAXAAVMyClassA@@@Z");
static assert(fund.mangleof == "?fund@@YAXABVMyClassA@@@Z");
static assert(fune.mangleof == "?fune@@YAXPBVMyClassA@@@Z");
}
}
//Basic tests with a namespace
extern(C++, "ns")
{
class MyClassB {}
void funf(ScopeClass!MyClassB); // mangles MyClass
void fung(const ScopeClass!MyClassB); // mangles const MyClass
void funh(ref ScopeClass!MyClassB); // mangles MyClass&
void funi(ref const ScopeClass!MyClassB); // mangles const MyClass&
void funj(const(ScopeClass!MyClassB)*);
}
version (CppMangle_Itanium)
{
static assert(funf.mangleof == "_ZN2ns4funfENS_8MyClassBE");
static assert(fung.mangleof == "_ZN2ns4fungENS_8MyClassBE");
static assert(funh.mangleof == "_ZN2ns4funhERNS_8MyClassBE");
static assert(funi.mangleof == "_ZN2ns4funiERKNS_8MyClassBE");
static assert(funj.mangleof == "_ZN2ns4funjEPKNS_8MyClassBE");
}
else version (CppRuntime_Microsoft)
{
static assert(funf.mangleof == "?funf@ns@@YAXVMyClassB@1@@Z");
static assert(fung.mangleof == "?fung@ns@@YAXVMyClassB@1@@Z");
static if (size_t.sizeof == ulong.sizeof)
{
static assert(funh.mangleof == "?funh@ns@@YAXAEAVMyClassB@1@@Z");
static assert(funi.mangleof == "?funi@ns@@YAXAEBVMyClassB@1@@Z");
static assert(funj.mangleof == "?funj@ns@@YAXPEBVMyClassB@1@@Z");
}
else
{
static assert(funh.mangleof == "?funh@ns@@YAXAAVMyClassB@1@@Z");
static assert(funi.mangleof == "?funi@ns@@YAXABVMyClassB@1@@Z");
static assert(funj.mangleof == "?funj@ns@@YAXPBVMyClassB@1@@Z");
}
}
//Templates
extern(C++)
{
void funTempl(T)();
class MyClassC {}
alias funTemplA = funTempl!(ScopeClass!MyClassC);
alias funTemplB = funTempl!(const ScopeClass!MyClassC);
alias funTemplC = funTempl!(const(ScopeClass!MyClassC)*);
// N.B funTempl!([const] ref ScopeClass!MyClassC) is not permissable in D
}
version (CppMangle_Itanium)
{
static assert(funTemplA.mangleof == "_Z8funTemplI8MyClassCEvv");
static assert(funTemplB.mangleof == "_Z8funTemplIK8MyClassCEvv");
static assert(funTemplC.mangleof == "_Z8funTemplIPK8MyClassCEvv");
}
else version (CppRuntime_Microsoft)
{
static assert(funTemplA.mangleof == "??$funTempl@VMyClassC@@@@YAXXZ");
static assert(funTemplB.mangleof == "??$funTempl@$$CBVMyClassC@@@@YAXXZ");
static if (size_t.sizeof == ulong.sizeof)
static assert(funTemplC.mangleof == "??$funTempl@PEBVMyClassC@@@@YAXXZ");
else
static assert(funTemplC.mangleof == "??$funTempl@PBVMyClassC@@@@YAXXZ");
}
template _function(F)
{
extern(C++, "std")
{
extern(C++, struct)
pragma(mangle, "function")
class _function
{
}
}
}
template FunctionOf(F)
{
F f;
alias FunctionOf = typeof(*f);
}
extern(C++) void funk(ScopeClass!(_function!(FunctionOf!(void function(int))),"function") a ){ }
version (CppMangle_Itanium)
{
static assert(funk.mangleof == "_Z4funkSt8functionIFviEE");
}
else version (CppRuntime_Microsoft)
{
static assert(funk.mangleof == "?funk@@YAXV?$function@$$A6AXH@Z@std@@@Z");
}
extern(C++, "ns")
{
pragma(mangle, "function")
class _function2
{
public final void test();
}
}
version (CppMangle_Itanium)
{
static assert(_function2.test.mangleof == "_ZN2ns8function4testEv");
}
else version (CppRuntime_Microsoft)
{
static if (size_t.sizeof == ulong.sizeof)
static assert(_function2.test.mangleof == "?test@function@ns@@QEAAXXZ");
else
static assert(_function2.test.mangleof == "?test@function@ns@@QAEXXZ");
}
extern(C++, "ns")
{
template _function3(T)
{
pragma(mangle, _function3, "function")
class _function3
{
public final void test();
}
}
}
version (CppMangle_Itanium)
{
static assert(_function3!(int).test.mangleof == "_ZN2ns8functionIiE4testEv");
}
else version (CppRuntime_Microsoft)
{
static if (size_t.sizeof == ulong.sizeof)
static assert(_function3!(int).test.mangleof == "?test@?$function@H@ns@@QEAAXXZ");
else
static assert(_function3!(int).test.mangleof == "?test@?$function@H@ns@@QAEXXZ");
}
extern(C++)
{
struct Foo {}
pragma(mangle, Foo) struct Foo_Doppelganger {}
void funl(Foo_Doppelganger f);
}
version (CppMangle_Itanium)
{
static assert(funl.mangleof == "_Z4funl3Foo");
}
else version (CppRuntime_Microsoft)
{
static assert(funl.mangleof == "?funl@@YAXUFoo@@@Z");
}