https://issues.dlang.org/show_bug.cgi?id=15372
Issue ID: 15372 Summary: DMD emits wrong mangling for extern(C++) free function templates Product: D Version: D2 Hardware: All OS: Linux Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nob...@puremagic.com Reporter: jakobov...@gmail.com cppsrc/interop.cpp: ---- template<class T> void foo() { } void test() { foo<int>(); } ---- dsrc/interop.d: ---- extern(C++) void foo(T)(); void main() { foo!int(); } ---- Built with: ---- g++ -c cppsrc/interop.cpp --output=cpp_interop.o dmd dsrc/interop.d cpp_interop.o ---- Output: ---- interop.o: In function `_Dmain': dsrc/interop.d:(.text._Dmain+0x5): undefined reference to `foo<int>::foo()' collect2: error: ld returned 1 exit status --- errorlevel 1 ---- nm --demangle cpp_interop.o: ---- 0000000000000000 W void foo<int>() 0000000000000000 T test() ---- nm --demangle interop.o: ---- ... U foo<int>::foo() ... ---- nm cpp_interop.o: ---- 0000000000000000 W _Z3fooIiEvv 0000000000000000 T _Z4testv ---- nm interop.o: ---- ... U _ZN3fooIiE3fooEv ... ---- Using g++ (GCC) 5.2.0 and DMD git head on Linux. Passing --std=c++11 when compiling the C++ code results in the same mangled names. Using -L-lstdc++ is of course not relevant here either. This is an issue for https://github.com/D-Programming-Language/dlang.org/pull/1154 --