From: Jonathan Wakely Date: Wed, 25 Jan 2017 15:01:05 +0000 (+0000) Subject: PR libstdc++/70607 make proj(T) and conj(T) return complex X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=536c221d20d42459739e34e3a5aba8268cf48a6f;p=gcc.git PR libstdc++/70607 make proj(T) and conj(T) return complex PR libstdc++/61791 PR libstdc++/70607 * include/std/complex (real(T), imag(T)): Add _GLIBCXX_CONSTEXPR. (proj(T), conj(T)): Change return types per DR 1522. * include/tr1/complex (conj): Remove overloads and use std::conj. * testsuite/26_numerics/complex/dr781_dr1137.cc: Rename to... * testsuite/26_numerics/complex/dr781.cc: ... this, and update. * testsuite/26_numerics/complex/value_operations/constexpr2.cc: Test real(T) and imag(T). Allow testing for C++11 too. From-SVN: r244900 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 24fc5ae6486..41b5d785e32 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2017-01-25 Jonathan Wakely + + PR libstdc++/61791 + PR libstdc++/70607 + * include/std/complex (real(T), imag(T)): Add _GLIBCXX_CONSTEXPR. + (proj(T), conj(T)): Change return types per DR 1522. + * include/tr1/complex (conj): Remove overloads and use std::conj. + * testsuite/26_numerics/complex/dr781_dr1137.cc: Rename to... + * testsuite/26_numerics/complex/dr781.cc: ... this, and update. + * testsuite/26_numerics/complex/value_operations/constexpr2.cc: Test + real(T) and imag(T). Allow testing for C++11 too. + 2017-01-24 Jonathan Wakely PR libstdc++/79206 diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index 12b6e41382a..6342c98e88a 100644 --- a/libstdc++-v3/include/std/complex +++ b/libstdc++-v3/include/std/complex @@ -1840,7 +1840,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template - inline typename __gnu_cxx::__promote<_Tp>::__type + _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type imag(_Tp) { return _Tp(); } @@ -1853,7 +1853,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template - inline typename __gnu_cxx::__promote<_Tp>::__type + _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type real(_Tp __x) { return __x; } @@ -1921,16 +1921,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __complex_proj(__z); } #endif - // DR 1137. template - inline typename __gnu_cxx::__promote<_Tp>::__type + inline std::complex::__type> proj(_Tp __x) - { return __x; } + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return std::proj(std::complex<__type>(__x)); + } template - inline typename __gnu_cxx::__promote<_Tp>::__type + inline std::complex::__type> conj(_Tp __x) - { return __x; } + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return std::complex<__type>(__x, -__type()); + } _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/include/tr1/complex b/libstdc++-v3/include/tr1/complex index 8624e555f65..06f9ab0fcd8 100644 --- a/libstdc++-v3/include/tr1/complex +++ b/libstdc++-v3/include/tr1/complex @@ -371,17 +371,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } using std::arg; - - template - inline std::complex<_Tp> - conj(const std::complex<_Tp>& __z) - { return std::conj(__z); } - - template - inline std::complex::__type> - conj(_Tp __x) - { return __x; } - + using std::conj; using std::imag; using std::norm; using std::polar; diff --git a/libstdc++-v3/testsuite/26_numerics/complex/dr781.cc b/libstdc++-v3/testsuite/26_numerics/complex/dr781.cc new file mode 100644 index 00000000000..3fb6cd1022f --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/complex/dr781.cc @@ -0,0 +1,81 @@ +// { dg-do run { target c++11 } } +// 2008-05-22 Paolo Carlini +// +// Copyright (C) 2008-2017 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 + +// DR 781. std::complex should add missing C99 functions. +// DR 1137. Return type of conj and proj. +// 1522. conj specification is now nonsense +void test01() +{ + using __gnu_test::check_ret_type; + + typedef std::complex cmplx_f_type; + typedef std::complex cmplx_d_type; + typedef std::complex cmplx_ld_type; + + const int i1 = 1; + const float f1 = 1.0f; + const double d1 = 1.0; + const long double ld1 = 1.0l; + + const cmplx_f_type c_f1(f1, f1); + const cmplx_d_type c_d1(d1, d1); + const cmplx_ld_type c_ld1(ld1, ld1); + + check_ret_type(std::proj(c_f1)); + check_ret_type(std::proj(c_d1)); + check_ret_type(std::proj(c_ld1)); + + check_ret_type(std::proj(f1)); + check_ret_type(std::proj(d1)); + check_ret_type(std::proj(i1)); + check_ret_type(std::proj(ld1)); + + VERIFY( std::proj(f1) == std::proj(cmplx_f_type(f1)) ); + VERIFY( std::proj(d1) == std::proj(cmplx_d_type(d1)) ); + VERIFY( std::proj(ld1) == std::proj(cmplx_ld_type(ld1)) ); + VERIFY( std::proj(i1) == std::proj(double(i1)) ); + + check_ret_type(std::conj(c_f1)); + check_ret_type(std::conj(c_d1)); + check_ret_type(std::conj(c_ld1)); + + check_ret_type(std::conj(f1)); + check_ret_type(std::conj(d1)); + check_ret_type(std::conj(i1)); + check_ret_type(std::conj(ld1)); + + VERIFY( std::conj(f1) == std::conj(cmplx_f_type(f1)) ); + VERIFY( std::conj(d1) == std::conj(cmplx_d_type(d1)) ); + VERIFY( std::conj(ld1) == std::conj(cmplx_ld_type(ld1)) ); + VERIFY( std::conj(i1) == std::conj(double(i1)) ); + VERIFY( std::signbit(std::conj(f1).imag()) ); + VERIFY( std::signbit(std::conj(d1).imag()) ); + VERIFY( std::signbit(std::conj(ld1).imag()) ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/26_numerics/complex/dr781_dr1137.cc b/libstdc++-v3/testsuite/26_numerics/complex/dr781_dr1137.cc deleted file mode 100644 index 861208799fe..00000000000 --- a/libstdc++-v3/testsuite/26_numerics/complex/dr781_dr1137.cc +++ /dev/null @@ -1,69 +0,0 @@ -// { dg-do run { target c++11 } } -// 2008-05-22 Paolo Carlini -// -// Copyright (C) 2008-2017 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 - -// DR 781. std::complex should add missing C99 functions. -// DR 1137. Return type of conj and proj. -void test01() -{ - using __gnu_test::check_ret_type; - - typedef std::complex cmplx_f_type; - typedef std::complex cmplx_d_type; - typedef std::complex cmplx_ld_type; - - const int i1 = 1; - const float f1 = 1.0f; - const double d1 = 1.0; - const long double ld1 = 1.0l; - - const cmplx_f_type c_f1(f1, f1); - const cmplx_d_type c_d1(d1, d1); - const cmplx_ld_type c_ld1(ld1, ld1); - - check_ret_type(std::proj(c_f1)); - check_ret_type(std::proj(c_d1)); - check_ret_type(std::proj(c_ld1)); - - check_ret_type(std::proj(f1)); - check_ret_type(std::proj(d1)); - check_ret_type(std::proj(i1)); - VERIFY( std::proj(i1) == std::proj(double(i1)) ); - check_ret_type(std::proj(ld1)); - - check_ret_type(std::conj(c_f1)); - check_ret_type(std::conj(c_d1)); - check_ret_type(std::conj(c_ld1)); - - check_ret_type(std::conj(f1)); - check_ret_type(std::conj(d1)); - check_ret_type(std::conj(i1)); - VERIFY( std::conj(i1) == std::conj(double(i1)) ); - check_ret_type(std::conj(ld1)); -} - -int main() -{ - test01(); - return 0; -} diff --git a/libstdc++-v3/testsuite/26_numerics/complex/value_operations/constexpr2.cc b/libstdc++-v3/testsuite/26_numerics/complex/value_operations/constexpr2.cc index 94840eca56b..c6e91c28c19 100644 --- a/libstdc++-v3/testsuite/26_numerics/complex/value_operations/constexpr2.cc +++ b/libstdc++-v3/testsuite/26_numerics/complex/value_operations/constexpr2.cc @@ -1,4 +1,4 @@ -// { dg-do compile { target c++14 } } +// { dg-do compile { target c++11 } } // Copyright (C) 2014-2017 Free Software Foundation, Inc. // @@ -24,4 +24,6 @@ int main() constexpr std::complex c{}; constexpr auto r __attribute__((unused)) = real(c); constexpr auto i __attribute__((unused)) = imag(c); + constexpr double r2 __attribute__((unused)) = std::real(0.0); + constexpr double i2 __attribute__((unused)) = std::imag(0.0); }