diff options
author | Richard B. Kreckel <kreckel@ginac.de> | 2011-10-27 11:00:25 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2011-10-27 11:00:25 +0000 |
commit | 259f206328b3de4f4d35ffd22540ba2e75248646 (patch) | |
tree | 620e30a17939bf79786ab66334d4b0041cd8c78d /libstdc++-v3 | |
parent | e7a7929d91e79912fc626ba178d8ee7bd68bed5e (diff) | |
download | gcc-259f206328b3de4f4d35ffd22540ba2e75248646.zip gcc-259f206328b3de4f4d35ffd22540ba2e75248646.tar.gz gcc-259f206328b3de4f4d35ffd22540ba2e75248646.tar.bz2 |
re PR libstdc++/50880 (__complex_acosh() picks wrong complex branch)
2011-10-27 Richard B. Kreckel <kreckel@ginac.de>
Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/50880
* include/std/complex (__complex_acosh): Fix for __z.real() < 0.
* include/tr1/complex (__complex_acosh): Likewise.
* testsuite/26_numerics/complex/50880.cc: New.
* testsuite/tr1/8_c_compatibility/complex/50880.cc: Likewise.
Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>
From-SVN: r180563
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/std/complex | 2 | ||||
-rw-r--r-- | libstdc++-v3/include/tr1/complex | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/26_numerics/complex/50880.cc | 53 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/tr1/8_c_compatibility/complex/50880.cc | 51 |
5 files changed, 117 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b7d9618..d92d363 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2011-10-27 Richard B. Kreckel <kreckel@ginac.de> + Paolo Carlini <paolo.carlini@oracle.com> + + PR libstdc++/50880 + * include/std/complex (__complex_acosh): Fix for __z.real() < 0. + * include/tr1/complex (__complex_acosh): Likewise. + * testsuite/26_numerics/complex/50880.cc: New. + * testsuite/tr1/8_c_compatibility/complex/50880.cc: Likewise. + 2011-10-27 Jonathan Wakely <jwakely.gcc@gmail.com> PR libstdc++/50862 diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index 82ac62d..7f1581b 100644 --- a/libstdc++-v3/include/std/complex +++ b/libstdc++-v3/include/std/complex @@ -1690,6 +1690,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * (__z.real() + __z.imag()) - _Tp(1.0), _Tp(2.0) * __z.real() * __z.imag()); __t = std::sqrt(__t); + if (__z.real() < _Tp(-0.0)) + __t = -__t; return std::log(__t + __z); } diff --git a/libstdc++-v3/include/tr1/complex b/libstdc++-v3/include/tr1/complex index fc213b8..d29b13f 100644 --- a/libstdc++-v3/include/tr1/complex +++ b/libstdc++-v3/include/tr1/complex @@ -189,6 +189,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * (__z.real() + __z.imag()) - _Tp(1.0), _Tp(2.0) * __z.real() * __z.imag()); __t = std::sqrt(__t); + if (__z.real() < _Tp(-0.0)) + __t = -__t; return std::log(__t + __z); } diff --git a/libstdc++-v3/testsuite/26_numerics/complex/50880.cc b/libstdc++-v3/testsuite/26_numerics/complex/50880.cc new file mode 100644 index 0000000..2b70a99 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/complex/50880.cc @@ -0,0 +1,53 @@ +// { dg-options "-std=gnu++0x" } +// +// Copyright (C) 2011 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 <complex> +#include <testsuite_hooks.h> + +template<typename T> + void test01_do() + { + bool test __attribute__((unused)) = true; + + const std::complex<T> ca(T(-2), T(2)); + const std::complex<T> cb(T(-2), T(0)); + const std::complex<T> cc(T(-2), T(-2)); + + std::complex<T> cra = std::acosh(ca); + std::complex<T> crb = std::acosh(cb); + std::complex<T> crc = std::acosh(cc); + + VERIFY( cra.real() > T(0) ); + VERIFY( crb.real() > T(0) ); + VERIFY( crc.real() > T(0) ); + } + +// libstdc++/50880 +void test01() +{ + test01_do<float>(); + test01_do<double>(); + test01_do<long double>(); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/tr1/8_c_compatibility/complex/50880.cc b/libstdc++-v3/testsuite/tr1/8_c_compatibility/complex/50880.cc new file mode 100644 index 0000000..eaa2f3d --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/8_c_compatibility/complex/50880.cc @@ -0,0 +1,51 @@ +// Copyright (C) 2011 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 <tr1/complex> +#include <testsuite_hooks.h> + +template<typename T> + void test01_do() + { + bool test __attribute__((unused)) = true; + + const std::complex<T> ca(T(-2), T(2)); + const std::complex<T> cb(T(-2), T(0)); + const std::complex<T> cc(T(-2), T(-2)); + + std::complex<T> cra = std::tr1::acosh(ca); + std::complex<T> crb = std::tr1::acosh(cb); + std::complex<T> crc = std::tr1::acosh(cc); + + VERIFY( cra.real() > T(0) ); + VERIFY( crb.real() > T(0) ); + VERIFY( crc.real() > T(0) ); + } + +// libstdc++/50880 +void test01() +{ + test01_do<float>(); + test01_do<double>(); + test01_do<long double>(); +} + +int main() +{ + test01(); + return 0; +} |