From: Marc Glisse Date: Fri, 5 Oct 2012 16:20:44 +0000 (+0200) Subject: re PR target/54686 (std::abs (long long) resorts to std::abs (double) if llabs is... X-Git-Tag: misc/gccgo-go1_1_2~387 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8f2b580aeb950a7f2a8e95d16d79daa21f88143d;p=thirdparty%2Fgcc.git re PR target/54686 (std::abs (long long) resorts to std::abs (double) if llabs is absent) 2012-10-05 Marc Glisse PR libstdc++/54686 * include/c_std/cstdlib (abs(long long)): Define with __builtin_llabs when we have long long. (abs(long)): Use __builtin_labs. (abs(__int128)): Define when we have __int128. * testsuite/26_numerics/headers/cstdlib/54686.c: New file. From-SVN: r192132 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5f3564077503..6ae10a8eb11e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2012-10-05 Marc Glisse + + PR libstdc++/54686 + * include/c_std/cstdlib (abs(long long)): Define with + __builtin_llabs when we have long long. + (abs(long)): Use __builtin_labs. + (abs(__int128)): Define when we have __int128. + * testsuite/26_numerics/headers/cstdlib/54686.c: New file. + 2012-10-03 Paolo Carlini PR libstdc++/53248 diff --git a/libstdc++-v3/include/c_std/cstdlib b/libstdc++-v3/include/c_std/cstdlib index c3fe8aa4507d..345920b76c28 100644 --- a/libstdc++-v3/include/c_std/cstdlib +++ b/libstdc++-v3/include/c_std/cstdlib @@ -135,7 +135,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif // _GLIBCXX_USE_WCHAR_T inline long - abs(long __i) { return labs(__i); } + abs(long __i) { return __builtin_labs(__i); } + +#ifdef _GLIBCXX_USE_LONG_LONG + inline long long + abs(long long __x) { return __builtin_llabs (__x); } +#endif + +#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128) + inline __int128 + abs(__int128 __x) { return __x >= 0 ? __x : -__x; } +#endif inline ldiv_t div(long __i, long __j) { return ldiv(__i, __j); } @@ -168,9 +178,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION using ::_Exit; #endif - inline long long - abs(long long __x) { return __x >= 0 ? __x : -__x; } - #if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC using ::llabs; @@ -205,7 +212,6 @@ namespace std using ::__gnu_cxx::lldiv_t; #endif using ::__gnu_cxx::_Exit; - using ::__gnu_cxx::abs; #if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC using ::__gnu_cxx::llabs; using ::__gnu_cxx::div; diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/54686.c b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/54686.c new file mode 100644 index 000000000000..fd723c89e7c4 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/54686.c @@ -0,0 +1,32 @@ +// { dg-do compile } +// { dg-options "-std=c++11" } + +// Copyright (C) 2012 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include +#include +#include + +#ifdef _GLIBCXX_USE_LONG_LONG +void test01() +{ + static_assert (std::is_same ())), + long long>::value, "Missing abs(long long)"); +} +#endif