From 536c221d20d42459739e34e3a5aba8268cf48a6f Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 25 Jan 2017 15:01:05 +0000 Subject: [PATCH] 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 --- libstdc++-v3/ChangeLog | 12 ++++++++ libstdc++-v3/include/std/complex | 19 ++++++++----- libstdc++-v3/include/tr1/complex | 12 +------- .../complex/{dr781_dr1137.cc => dr781.cc} | 28 +++++++++++++------ .../complex/value_operations/constexpr2.cc | 4 ++- 5 files changed, 48 insertions(+), 27 deletions(-) rename libstdc++-v3/testsuite/26_numerics/complex/{dr781_dr1137.cc => dr781.cc} (67%) 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_dr1137.cc b/libstdc++-v3/testsuite/26_numerics/complex/dr781.cc similarity index 67% rename from libstdc++-v3/testsuite/26_numerics/complex/dr781_dr1137.cc rename to libstdc++-v3/testsuite/26_numerics/complex/dr781.cc index 861208799fe..3fb6cd1022f 100644 --- a/libstdc++-v3/testsuite/26_numerics/complex/dr781_dr1137.cc +++ b/libstdc++-v3/testsuite/26_numerics/complex/dr781.cc @@ -24,6 +24,7 @@ // 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; @@ -45,21 +46,32 @@ void test01() 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(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::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)); + 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)) ); - check_ret_type(std::conj(ld1)); + VERIFY( std::signbit(std::conj(f1).imag()) ); + VERIFY( std::signbit(std::conj(d1).imag()) ); + VERIFY( std::signbit(std::conj(ld1).imag()) ); } int main() 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); } -- 2.30.2