aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2017-01-25 15:01:05 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2017-01-25 15:01:05 +0000
commit536c221d20d42459739e34e3a5aba8268cf48a6f (patch)
tree493bd6545f0a7185424b11d26531ab57a6d3096f /libstdc++-v3
parenta5d6927fef24c2cae73e473f8c997631eeb63152 (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--libstdc++-v3/include/std/complex19
-rw-r--r--libstdc++-v3/include/tr1/complex12
-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.cc4
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);
}