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.

Reply via email to