diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-10-05 18:20:44 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2012-10-05 16:20:44 +0000 |
commit | 8f2b580aeb950a7f2a8e95d16d79daa21f88143d (patch) | |
tree | 1b31d51135c9ba258548f10c45d869ba38f82fe6 | |
parent | 92e2cbfa6a145ce26711689d21233f89d8c5a3dd (diff) | |
download | gcc-8f2b580aeb950a7f2a8e95d16d79daa21f88143d.zip gcc-8f2b580aeb950a7f2a8e95d16d79daa21f88143d.tar.gz gcc-8f2b580aeb950a7f2a8e95d16d79daa21f88143d.tar.bz2 |
re PR target/54686 (std::abs (long long) resorts to std::abs (double) if llabs is absent)
2012-10-05 Marc Glisse <marc.glisse@inria.fr>
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/c_std/cstdlib | 16 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/26_numerics/headers/cstdlib/54686.c | 32 |
3 files changed, 52 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5f35640..6ae10a8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2012-10-05 Marc Glisse <marc.glisse@inria.fr> + + 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 <paolo.carlini@oracle.com> PR libstdc++/53248 diff --git a/libstdc++-v3/include/c_std/cstdlib b/libstdc++-v3/include/c_std/cstdlib index c3fe8aa..345920b 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 0000000..fd723c8 --- /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 +// <http://www.gnu.org/licenses/>. + +#include <cmath> +#include <cstdlib> +#include <type_traits> +#include <utility> + +#ifdef _GLIBCXX_USE_LONG_LONG +void test01() +{ + static_assert (std::is_same<decltype (std::abs (std::declval<long long> ())), + long long>::value, "Missing abs(long long)"); +} +#endif |