diff mbox

[v3] (Re-)enable pow(const complex<>&, int) in C++11 mode

Message ID 51F18153.1000604@oracle.com
State New
Headers show

Commit Message

Paolo Carlini July 25, 2013, 7:49 p.m. UTC
Hi,

as discussed once more in the audit trail of PR57974 and agreed with 
Gaby I'm going to re-enable the overload. Tested x86_64-linux.

Thanks,
Paolo.

//////////////////////
2013-07-25  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/std/complex (pow(const complex<>&, int)): Enable in
	C++11 mode too.
	* testsuite/26_numerics/complex/dr844.cc: Adjust.
	* doc/xml/manual/intro.xml: Update.
diff mbox

Patch

Index: doc/xml/manual/intro.xml
===================================================================
--- doc/xml/manual/intro.xml	(revision 201244)
+++ doc/xml/manual/intro.xml	(working copy)
@@ -791,12 +791,6 @@ 
     <listitem><para>Add the overload.
     </para></listitem></varlistentry>
 
-    <varlistentry><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../ext/lwg-defects.html#844">844</link>:
-	<emphasis>complex pow return type is ambiguous</emphasis>
-    </term>
-    <listitem><para>In C++11 mode, remove the pow(complex&lt;T&gt;, int) signature.
-    </para></listitem></varlistentry>
-
     <varlistentry><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../ext/lwg-defects.html#853">853</link>:
 	<emphasis>to_string needs updating with zero and one</emphasis>
     </term>
Index: include/std/complex
===================================================================
--- include/std/complex	(revision 201244)
+++ include/std/complex	(working copy)
@@ -88,11 +88,8 @@ 
   template<typename _Tp> complex<_Tp> log(const complex<_Tp>&);
   /// Return complex base 10 logarithm of @a z.
   template<typename _Tp> complex<_Tp> log10(const complex<_Tp>&);
-#if __cplusplus < 201103L
-  // DR 844.
   /// Return @a x to the @a y'th power.
   template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, int);
-#endif
   /// Return @a x to the @a y'th power.
   template<typename _Tp> complex<_Tp> pow(const complex<_Tp>&, const _Tp&);
   /// Return @a x to the @a y'th power.
@@ -955,7 +952,6 @@ 
   // 26.2.8/9  pow(__x, __y): Returns the complex power base of __x
   //                          raised to the __y-th power.  The branch
   //                          cut is on the negative axis.
-#if __cplusplus < 201103L
   template<typename _Tp>
     complex<_Tp>
     __complex_pow_unsigned(complex<_Tp> __x, unsigned __n)
@@ -972,8 +968,12 @@ 
       return __y;
     }
 
-  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // In C++11 mode we used to implement the resolution of
   // DR 844. complex pow return type is ambiguous.
+  // thus the following overload was disabled in that mode.  However, doing
+  // that causes all sorts of issues, see, for example:
+  //   http://gcc.gnu.org/ml/libstdc++/2013-01/msg00058.html
+  // and also PR57974.
   template<typename _Tp>
     inline complex<_Tp>
     pow(const complex<_Tp>& __z, int __n)
@@ -982,7 +982,6 @@ 
 	? complex<_Tp>(1) / std::__complex_pow_unsigned(__z, -(unsigned)__n)
         : std::__complex_pow_unsigned(__z, __n);
     }
-#endif
 
   template<typename _Tp>
     complex<_Tp>
Index: testsuite/26_numerics/complex/dr844.cc
===================================================================
--- testsuite/26_numerics/complex/dr844.cc	(revision 201244)
+++ testsuite/26_numerics/complex/dr844.cc	(working copy)
@@ -22,7 +22,11 @@ 
 #include <testsuite_hooks.h>
 #include <testsuite_tr1.h>
 
+// In C++11 mode we used to implement the resolution of
 // DR 844. complex pow return type is ambiguous.
+// However, doing that causes all sorts of issues, see, for example:
+//   http://gcc.gnu.org/ml/libstdc++/2013-01/msg00058.html
+// and also PR57974.
 void test01()
 {
   bool test __attribute__((unused)) = true;
@@ -37,9 +41,7 @@ 
   const double       d1 = 1.0;
   const long double ld1 = 1.0l;
 
-  check_ret_type<cmplx_d_type>(std::pow(cmplx_f_type(f1, f1), i1));
-  VERIFY( std::pow(cmplx_f_type(f1, f1), i1)
-	  == std::pow(cmplx_d_type(f1, f1), double(i1)) );
+  check_ret_type<cmplx_f_type>(std::pow(cmplx_f_type(f1, f1), i1));
   check_ret_type<cmplx_d_type>(std::pow(cmplx_d_type(d1, d1), i1));
   check_ret_type<cmplx_ld_type>(std::pow(cmplx_ld_type(ld1, ld1), i1));
 }