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
This commit is contained in:
parent
a5d6927fef
commit
536c221d20
5 changed files with 48 additions and 27 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue