diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2017-01-25 15:01:05 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2017-01-25 15:01:05 +0000 |
commit | 536c221d20d42459739e34e3a5aba8268cf48a6f (patch) | |
tree | 493bd6545f0a7185424b11d26531ab57a6d3096f /libstdc++-v3 | |
parent | a5d6927fef24c2cae73e473f8c997631eeb63152 (diff) | |
download | gcc-536c221d20d42459739e34e3a5aba8268cf48a6f.zip gcc-536c221d20d42459739e34e3a5aba8268cf48a6f.tar.gz gcc-536c221d20d42459739e34e3a5aba8268cf48a6f.tar.bz2 |
PR libstdc++/70607 make proj(T) and conj(T) return complex<T>
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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/std/complex | 19 | ||||
-rw-r--r-- | libstdc++-v3/include/tr1/complex | 12 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/26_numerics/complex/dr781.cc (renamed from libstdc++-v3/testsuite/26_numerics/complex/dr781_dr1137.cc) | 28 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/26_numerics/complex/value_operations/constexpr2.cc | 4 |
5 files changed, 48 insertions, 27 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 24fc5ae..41b5d78 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2017-01-25 Jonathan Wakely <jwakely@redhat.com> + + 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 <jwakely@redhat.com> PR libstdc++/79206 diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index 12b6e41..6342c98 100644 --- a/libstdc++-v3/include/std/complex +++ b/libstdc++-v3/include/std/complex @@ -1840,7 +1840,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template<typename _Tp> - 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<typename _Tp> - 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<typename _Tp> - inline typename __gnu_cxx::__promote<_Tp>::__type + inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type> proj(_Tp __x) - { return __x; } + { + typedef typename __gnu_cxx::__promote<_Tp>::__type __type; + return std::proj(std::complex<__type>(__x)); + } template<typename _Tp> - inline typename __gnu_cxx::__promote<_Tp>::__type + inline std::complex<typename __gnu_cxx::__promote<_Tp>::__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 8624e55..06f9ab0 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<typename _Tp> - inline std::complex<_Tp> - conj(const std::complex<_Tp>& __z) - { return std::conj(__z); } - - template<typename _Tp> - inline std::complex<typename __gnu_cxx::__promote<_Tp>::__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 index 8612087..3fb6cd1 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<cmplx_d_type>(std::proj(c_d1)); check_ret_type<cmplx_ld_type>(std::proj(c_ld1)); - check_ret_type<float>(std::proj(f1)); - check_ret_type<double>(std::proj(d1)); - check_ret_type<double>(std::proj(i1)); + check_ret_type<cmplx_f_type>(std::proj(f1)); + check_ret_type<cmplx_d_type>(std::proj(d1)); + check_ret_type<cmplx_d_type>(std::proj(i1)); + check_ret_type<cmplx_ld_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<long double>(std::proj(ld1)); check_ret_type<cmplx_f_type>(std::conj(c_f1)); check_ret_type<cmplx_d_type>(std::conj(c_d1)); check_ret_type<cmplx_ld_type>(std::conj(c_ld1)); - check_ret_type<float>(std::conj(f1)); - check_ret_type<double>(std::conj(d1)); - check_ret_type<double>(std::conj(i1)); + check_ret_type<cmplx_f_type>(std::conj(f1)); + check_ret_type<cmplx_d_type>(std::conj(d1)); + check_ret_type<cmplx_d_type>(std::conj(i1)); + check_ret_type<cmplx_ld_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<long double>(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 94840ec..c6e91c2 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<int> 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); } |