+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
}
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
imag(_Tp)
{ return _Tp(); }
}
template<typename _Tp>
- inline typename __gnu_cxx::__promote<_Tp>::__type
+ _GLIBCXX_CONSTEXPR inline typename __gnu_cxx::__promote<_Tp>::__type
real(_Tp __x)
{ return __x; }
{ 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
}
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;
--- /dev/null
+// { dg-do run { target c++11 } }
+// 2008-05-22 Paolo Carlini <paolo.carlini@oracle.com>
+//
+// 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
+// <http://www.gnu.org/licenses/>.
+
+#include <complex>
+#include <testsuite_hooks.h>
+#include <testsuite_tr1.h>
+
+// 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<float> cmplx_f_type;
+ typedef std::complex<double> cmplx_d_type;
+ typedef std::complex<long double> 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<cmplx_f_type>(std::proj(c_f1));
+ check_ret_type<cmplx_d_type>(std::proj(c_d1));
+ check_ret_type<cmplx_ld_type>(std::proj(c_ld1));
+
+ 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<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<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)) );
+ 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;
+}
+++ /dev/null
-// { dg-do run { target c++11 } }
-// 2008-05-22 Paolo Carlini <paolo.carlini@oracle.com>
-//
-// 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
-// <http://www.gnu.org/licenses/>.
-
-#include <complex>
-#include <testsuite_hooks.h>
-#include <testsuite_tr1.h>
-
-// 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<float> cmplx_f_type;
- typedef std::complex<double> cmplx_d_type;
- typedef std::complex<long double> 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<cmplx_f_type>(std::proj(c_f1));
- 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));
- 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));
- VERIFY( std::conj(i1) == std::conj(double(i1)) );
- check_ret_type<long double>(std::conj(ld1));
-}
-
-int main()
-{
- test01();
- return 0;
-}
-// { dg-do compile { target c++14 } }
+// { dg-do compile { target c++11 } }
// Copyright (C) 2014-2017 Free Software Foundation, Inc.
//
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);
}