cmath (pow(float, int), [...]): Do not define in C++0x mode, per DR 550.
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 26 May 2008 19:18:24 +0000 (19:18 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 26 May 2008 19:18:24 +0000 (19:18 +0000)
2008-05-26  Paolo Carlini  <paolo.carlini@oracle.com>

* include/c_global/cmath (pow(float, int), pow(double, int),
pow(long double, int)): Do not define in C++0x mode, per DR 550.
* include/tr1_impl/cmath (pow): Do not bring in unconditionally
from namespace std.
* include/tr1/cmath (pow(double, double), pow(float, float),
pow(long double, long double), pow(_Tp, _Up)): Define.
* include/tr1/complex (pow): Do not bring in from namespace std.
(pow(const std::complex<_Tp>&, int), pow(const std::complex<_Tp>&,
const _Tp&), pow(const _Tp&, const std::complex<_Tp>&),
pow(const std::complex<_Tp>&, const std::complex<_Tp>&)): Define.
* include/tr1_impl/complex (pow(const std::complex<_Tp>&,
const _Up&), pow(const _Tp&, const std::complex<_Up>&),
pow(const std::complex<_Tp>&, const std::complex<_Up>&)): Always
define.
* doc/xml/manual/intro.xml: Add an entry for DR 550.
* testsuite/26_numerics/headers/cmath/dr550.cc: New.
* testsuite/tr1/8_c_compatibility/cmath/overloads.cc: Adjust.

From-SVN: r135955

libstdc++-v3/ChangeLog
libstdc++-v3/doc/xml/manual/intro.xml
libstdc++-v3/include/c_global/cmath
libstdc++-v3/include/tr1/cmath
libstdc++-v3/include/tr1/complex
libstdc++-v3/include/tr1_impl/cmath
libstdc++-v3/include/tr1_impl/complex
libstdc++-v3/testsuite/26_numerics/headers/cmath/dr550.cc [new file with mode: 0644]
libstdc++-v3/testsuite/tr1/8_c_compatibility/cmath/overloads.cc

index 6fae3e258dfdbc094d0dc4ca7165789f14333155..1c023cfe8279815a0d4b870e8d5738fc3045daae 100644 (file)
@@ -1,3 +1,23 @@
+2008-05-26  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * include/c_global/cmath (pow(float, int), pow(double, int),
+       pow(long double, int)): Do not define in C++0x mode, per DR 550.
+       * include/tr1_impl/cmath (pow): Do not bring in unconditionally
+       from namespace std.
+       * include/tr1/cmath (pow(double, double), pow(float, float),
+       pow(long double, long double), pow(_Tp, _Up)): Define.
+       * include/tr1/complex (pow): Do not bring in from namespace std.
+       (pow(const std::complex<_Tp>&, int), pow(const std::complex<_Tp>&,
+       const _Tp&), pow(const _Tp&, const std::complex<_Tp>&),
+       pow(const std::complex<_Tp>&, const std::complex<_Tp>&)): Define.
+       * include/tr1_impl/complex (pow(const std::complex<_Tp>&,
+       const _Up&), pow(const _Tp&, const std::complex<_Up>&),
+       pow(const std::complex<_Tp>&, const std::complex<_Up>&)): Always
+       define.
+       * doc/xml/manual/intro.xml: Add an entry for DR 550.
+       * testsuite/26_numerics/headers/cmath/dr550.cc: New.
+       * testsuite/tr1/8_c_compatibility/cmath/overloads.cc: Adjust.
+
 2008-05-25  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * include/std/tuple: Ifndef __GXX_EXPERIMENTAL_CXX0X__ just error out.
index 55c48a6d1fc0b619e1ddef84c905907349c9d600..1f6708dac9a379856be852564abef8d50a8a558b 100644 (file)
     <listitem><para>Follow the straightforward proposed resolution.
     </para></listitem></varlistentry>
 
+    <varlistentry><term><ulink url="../ext/lwg-active.html#550">550</ulink>:
+        <emphasis>What should the return type of pow(float,int) be?</emphasis>
+    </term>
+    <listitem><para>In C++0x mode, remove the pow(float,int), etc., signatures.
+    </para></listitem></varlistentry>
+
     <varlistentry><term><ulink url="../ext/lwg-defects.html#586">586</ulink>:
         <emphasis>string inserter not a formatted function</emphasis>
     </term>
index 21e21507b08de3dd14c9a3956d03df9285b62c49..dd26db1a718795841e578de2dcdff603ec14f3b7 100644 (file)
@@ -367,7 +367,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
   pow(long double __x, long double __y)
   { return __builtin_powl(__x, __y); }
 
-  // DR 550.
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // DR 550. What should the return type of pow(float,int) be?
   inline double
   pow(double __x, int __i)
   { return __builtin_powi(__x, __i); }
@@ -379,6 +381,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
   inline long double
   pow(long double __x, int __n)
   { return __builtin_powil(__x, __n); }
+#endif
 
   template<typename _Tp, typename _Up>
     inline
index 63e6a2e5fdafa91f3df47c23dc64c7818fd598e7..a9c5aecf0185af437f900ec8680735314812dfa3 100644 (file)
 #  undef _GLIBCXX_INCLUDE_AS_TR1
 #endif
 
+namespace std
+{
+namespace tr1
+{
+  // DR 550. What should the return type of pow(float,int) be?
+  // NB: C++0x and TR1 != C++03.
+  inline double
+  pow(double __x, double __y)
+  { return std::pow(__x, __y); }
+
+  inline float
+  pow(float __x, float __y)
+  { return std::pow(__x, __y); }
+
+  inline long double
+  pow(long double __x, long double __y)
+  { return std::pow(__x, __y); }
+
+  template<typename _Tp, typename _Up>
+    inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
+    pow(_Tp __x, _Up __y)
+    {
+      typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
+      return std::pow(__type(__x), __type(__y));
+    }
+}
+}
+
 #include <bits/stl_algobase.h>
 #include <limits>
 #include <tr1/type_traits>
index 8d14681e9557b980de94101bd9b5a9af962016be..b571a5982edc496494bd2a00d408c57df0a56e53 100644 (file)
@@ -75,9 +75,27 @@ namespace tr1
     }
 
   using std::real;
-  using std::pow;
+
+  template<typename _Tp>
+    inline std::complex<_Tp>
+    pow(const std::complex<_Tp>& __x, int __n)
+    { return std::pow(__x, __n); }
+
+  template<typename _Tp>
+    inline std::complex<_Tp>
+    pow(const std::complex<_Tp>& __x, const _Tp& __y)
+    { return std::pow(__x, __y); }
+
+  template<typename _Tp>
+    inline std::complex<_Tp>
+    pow(const _Tp& __x, const std::complex<_Tp>& __y)
+    { return std::pow(__x, __y); }
+
+  template<typename _Tp>
+    inline std::complex<_Tp>
+    pow(const std::complex<_Tp>& __x, const std::complex<_Tp>& __y)
+    { return std::pow(__x, __y); }
 }
 }
 
 #endif // _GLIBCXX_TR1_COMPLEX
-
index afb05e2aa7104d09e7470a27bdd0cb143a4c5a8d..d969a8feada7cfb3afdd8fdf6e6e81cbecd4c9ca 100644 (file)
@@ -763,7 +763,9 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
       return nexttoward(__type(__x), __y);
     }
 
-  using std::pow;
+  // DR 550. What should the return type of pow(float,int) be?
+  // NB: C++0x and TR1 != C++03.
+  //   using std::pow;
 
   inline float
   remainder(float __x, float __y)
index 8b4f97401f60376ed846fc3269e22c48cac305b3..46560deaa4b3a78e0848944faf4a038727c486a5 100644 (file)
@@ -301,12 +301,11 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     fabs(const std::complex<_Tp>& __z)
     { return std::abs(__z); }
 
-
+  /// Additional overloads [8.1.9].
 #if (defined(_GLIBCXX_INCLUDE_AS_CXX0X) \
      || (defined(_GLIBCXX_INCLUDE_AS_TR1) \
         && !defined(__GXX_EXPERIMENTAL_CXX0X__)))
 
-  /// Additional overloads [8.1.9].
   template<typename _Tp>
     inline typename __gnu_cxx::__promote<_Tp>::__type
     arg(_Tp __x)
@@ -338,6 +337,8 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     real(_Tp __x)
     { return __x; }
 
+#endif
+
   template<typename _Tp, typename _Up>
     inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type>
     pow(const std::complex<_Tp>& __x, const _Up& __y)
@@ -363,7 +364,5 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
                      std::complex<__type>(__y));
     }
 
-#endif
-
 _GLIBCXX_END_NAMESPACE_TR1
 }
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cmath/dr550.cc b/libstdc++-v3/testsuite/26_numerics/headers/cmath/dr550.cc
new file mode 100644 (file)
index 0000000..b3a9ce0
--- /dev/null
@@ -0,0 +1,47 @@
+// { dg-options "-std=gnu++0x" }
+// 2008-05-26  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2008 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 2, 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 COPYING.  If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+#include <cmath>
+#include <testsuite_hooks.h>
+#include <testsuite_tr1.h>
+
+// DR 550. What should the return type of pow(float,int) be?
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+  using __gnu_test::check_ret_type;
+
+  const int          i1 = 1;
+  const float        f1 = 1.0f;
+  const double       d1 = 1.0;
+  const long double ld1 = 1.0l;
+
+  check_ret_type<double>(std::pow(f1, i1));
+  VERIFY( std::pow(f1, i1) == std::pow(double(f1), double(i1)) );
+  check_ret_type<double>(std::pow(d1, i1));
+  check_ret_type<long double>(std::pow(ld1, i1));
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
index e925340081e43eff239673294b4559f5643067d4..fea560fc293e3330a163a1ad50c9384cbd9f4193 100644 (file)
@@ -206,9 +206,7 @@ void test01()
   check_ret_type<long double>(std::tr1::pow(ld0, d0));
   check_ret_type<double>(std::tr1::pow(i0, i0));
   check_ret_type<double>(std::tr1::pow(d0, i0));
-  // DR 550.
-  // check_ret_type<double>(std::tr1::pow(f0, i0));
-  check_ret_type<float>(std::tr1::pow(f0, i0));
+  check_ret_type<double>(std::tr1::pow(f0, i0));
 
   check_ret_type<double>(std::tr1::remainder(d0, d0));
   check_ret_type<double>(std::tr1::remainder(d0, f0));