]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR libstdc++/70607 make proj(T) and conj(T) return complex<T>
authorJonathan Wakely <jwakely@redhat.com>
Wed, 25 Jan 2017 15:01:05 +0000 (15:01 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 25 Jan 2017 15:01:05 +0000 (15:01 +0000)
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
libstdc++-v3/include/std/complex
libstdc++-v3/include/tr1/complex
libstdc++-v3/testsuite/26_numerics/complex/dr781.cc [moved from libstdc++-v3/testsuite/26_numerics/complex/dr781_dr1137.cc with 67% similarity]
libstdc++-v3/testsuite/26_numerics/complex/value_operations/constexpr2.cc

index 24fc5ae64860c0a918f56660cf1e14eca4ddde25..41b5d785e3294fa29cdc47283ea111b7199e6704 100644 (file)
@@ -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
index 12b6e41382a992cff3872c7e05c34755fffbd0b1..6342c98e88aee31a26f4680dd4e8523755b7fd17 100644 (file)
@@ -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
 
index 8624e555f656811a1e022ca970b23b744ba28668..06f9ab0fcd8f34e321e8c03a8907619630c0ff52 100644 (file)
@@ -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;
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 861208799feda30422c2e9a107e6e8e2f7856277..3fb6cd1022f684fd4192c4e0efabe9971aabf210 100644 (file)
@@ -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()
index 94840eca56b6c2a8fbdbf6dd087033b531c8d2de..c6e91c28c19dc7dc5bcaeb2f67e66f5635ccad2d 100644 (file)
@@ -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);
 }