From ceb6e523bd21ee863539e8f9a315ad68137f5222 Mon Sep 17 00:00:00 2001 From: paolo Date: Thu, 27 Oct 2011 11:00:25 +0000 Subject: [PATCH] 2011-10-27 Richard B. Kreckel Paolo Carlini 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180563 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 9 ++++ libstdc++-v3/include/std/complex | 2 + libstdc++-v3/include/tr1/complex | 2 + .../testsuite/26_numerics/complex/50880.cc | 53 ++++++++++++++++++++++ .../tr1/8_c_compatibility/complex/50880.cc | 51 +++++++++++++++++++++ 5 files changed, 117 insertions(+) create mode 100644 libstdc++-v3/testsuite/26_numerics/complex/50880.cc create mode 100644 libstdc++-v3/testsuite/tr1/8_c_compatibility/complex/50880.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b7d9618f00e..d92d36312df 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2011-10-27 Richard B. Kreckel + Paolo Carlini + + 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 PR libstdc++/50862 diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index 82ac62de61b..7f1581bbcb4 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 fc213b8f1d5..d29b13fe8b8 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 00000000000..2b70a99ddca --- /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 +// . + +#include +#include + +template + void test01_do() + { + bool test __attribute__((unused)) = true; + + const std::complex ca(T(-2), T(2)); + const std::complex cb(T(-2), T(0)); + const std::complex cc(T(-2), T(-2)); + + std::complex cra = std::acosh(ca); + std::complex crb = std::acosh(cb); + std::complex 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(); + test01_do(); + test01_do(); +} + +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 00000000000..eaa2f3d81f4 --- /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 +// . + +#include +#include + +template + void test01_do() + { + bool test __attribute__((unused)) = true; + + const std::complex ca(T(-2), T(2)); + const std::complex cb(T(-2), T(0)); + const std::complex cc(T(-2), T(-2)); + + std::complex cra = std::tr1::acosh(ca); + std::complex crb = std::tr1::acosh(cb); + std::complex 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(); + test01_do(); + test01_do(); +} + +int main() +{ + test01(); + return 0; +} -- 2.11.0