http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54686
Bug #: 54686 Summary: std::abs (long long) resorts to std::abs (double) if llabs is absent Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: olege...@gcc.gnu.org I'm not sure, whether this is intentional or not, but on my SH xgcc setup with newlib 1.20.0 the following: #include <cstddef> #include <cstdint> #include <algorithm> int64_t test (int64_t* b) { return std::abs (*b); } ends up doing an abs of a double. Looking at the preprocessed source, the following looks suspicious: template<typename _Tp> inline constexpr typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value, double>::__type abs(_Tp __x) { return __builtin_fabs(__x); } I guess since there's no overload for long long due to the lack of llabs, the template function above is taken instead. However, this can't be right and won't actually work for large 64 bit int numbers. Although probably the proper fix would be to add llabs to newlib, I think the enable_if above should also check whether the integer has any chance of fitting into the double.