Issue |
142187
|
Summary |
C++ mangling/ABI mismatch vs GCC
|
Labels |
clang
|
Assignees |
|
Reporter |
mstorsjo
|
https://godbolt.org/z/TK7Yr8b6c shows a difference in C++ mangling, or what symbol reference gets generated, between GCC and and Clang.
```c++
#include <type_traits>
namespace rocket {
template<typename charT>
class basic_tinyfmt;
using tinyfmt = basic_tinyfmt<char>;
using ::std::enable_if;
using ::std::is_arithmetic;
using ::std::is_same;
template<typename charT, typename valueT,
typename enable_if<is_arithmetic<valueT>::value
&& !is_same<valueT, charT>::value
>::type* = nullptr>
inline
basic_tinyfmt<charT>&
operator<<(basic_tinyfmt<charT>& fmt, valueT value); //...
extern template tinyfmt& operator<<(tinyfmt&, signed char);
extern template tinyfmt& operator<<(tinyfmt&, signed short);
extern template tinyfmt& operator<<(tinyfmt&, signed int);
extern template tinyfmt& operator<<(tinyfmt&, signed long);
extern template tinyfmt& operator<<(tinyfmt&, signed long long);
} // namespace rocket
void
do_format(::rocket::tinyfmt& fmt, int value)
{
fmt << value;
}
```
```console
$ g++ -S -o - cxx-mismatch.cpp -O2
[...]
_Z9do_formatRN6rocket13basic_tinyfmtIcEEi:
jmp _ZN6rocketlsIciLPv0EEERNS_13basic_tinyfmtIT_EES5_T0_@PLT
$ clang++ -S -o - cxx-mismatch.cpp -O2
_Z9do_formatRN6rocket13basic_tinyfmtIcEEi:
jmp _ZN6rocketlsIciTnPNSt9enable_ifIXaasr13is_arithmeticIT0_EE5valuentsr7is_sameIS2_T_EE5valueEvE4typeELPv0EEERNS_13basic_tinyfmtIS3_EESA_S2_@PLT
```
The generated function name is the same in both cases, `_Z9do_formatRN6rocket13basic_tinyfmtIcEEi`, but GCC references a function named `_ZN6rocketlsIciLPv0EEERNS_13basic_tinyfmtIT_EES5_T0_` while Clang references a function named `_ZN6rocketlsIciTnPNSt9enable_ifIXaasr13is_arithmeticIT0_EE5valuentsr7is_sameIS2_T_EE5valueEvE4typeELPv0EEERNS_13basic_tinyfmtIS3_EESA_S2_`; this can end up causing undefined references. Both symbols demangle into the same, `rocket::basic_tinyfmt<char>& rocket::operator<<<char, int, (void*)0>(rocket::basic_tinyfmt<char>&, int)`.
Issue originally encountered by @lhmouse.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs