re PR libstdc++/56216 (TR1 bessel functions bomb at x == 0!)
authorEdward Smith-Rowland <3dw4rd@verizon.net>
Fri, 8 Feb 2013 14:10:48 +0000 (14:10 +0000)
committerEdward Smith-Rowland <emsr@gcc.gnu.org>
Fri, 8 Feb 2013 14:10:48 +0000 (14:10 +0000)
PR libstdc++/56216

From-SVN: r195886

13 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1/bessel_function.tcc
libstdc++-v3/include/tr1/ell_integral.tcc
libstdc++-v3/include/tr1/exp_integral.tcc
libstdc++-v3/include/tr1/gamma.tcc
libstdc++-v3/include/tr1/hypergeometric.tcc
libstdc++-v3/include/tr1/legendre_function.tcc
libstdc++-v3/include/tr1/modified_bessel_func.tcc
libstdc++-v3/include/tr1/poly_hermite.tcc
libstdc++-v3/include/tr1/poly_laguerre.tcc
libstdc++-v3/include/tr1/riemann_zeta.tcc
libstdc++-v3/include/tr1/special_function_util.h
libstdc++-v3/testsuite/tr1/5_numerical_facilities/special_functions/08_cyl_bessel_i/pr56216.cc [new file with mode: 0644]

index 3c73f1f8a9926b6cb55b3448d130b2d6692ddbe9..2754cd06397b40c003006678abc19a9d1c88130d 100644 (file)
@@ -1,3 +1,23 @@
+2013-02-08  Edward Smith-Rowland  <3dw4rd@verizon.net>
+
+       PR libstdc++/56216
+       * include/tr1/special_function_util.h: Remove spurious const
+       from numeric arguments.
+       * include/tr1/riemann_zeta.tcc: Ditto.
+       * include/tr1/exp_integral.tcc: Ditto.
+       * include/tr1/bessel_function.tcc: Ditto.
+       * include/tr1/hypergeometric.tcc: Ditto.
+       * include/tr1/modified_bessel_func.tcc: Ditto.
+       * include/tr1/poly_laguerre.tcc: Ditto.
+       * include/tr1/gamma.tcc: Ditto.
+       * include/tr1/legendre_function.tcc: Ditto.
+       * include/tr1/poly_hermite.tcc: Ditto.
+       * include/tr1/ell_integral.tcc: Ditto.
+       * include/tr1/bessel_function.tcc (__cyl_bessel_ij_series):
+       If argument is zero return function value.
+       * testsuite/tr1/5_numerical_facilities/special_functions/08_cyl_bessel_i/pr56216.cc:
+       New file.
+
 2013-02-07  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * testsuite/27_io/basic_ios/pr56193.cc: Tweak.
index e30647121b714820201ab9400975fc8da5b55ea0..6cc152a2d0e35f7f1859cd0ec057f424b2f67869 100644 (file)
@@ -86,8 +86,8 @@ namespace tr1
      */
     template <typename _Tp>
     void
-    __gamma_temme(const _Tp __mu,
-                   _Tp & __gam1, _Tp & __gam2, _Tp & __gampl, _Tp & __gammi)
+    __gamma_temme(_Tp __mu,
+                  _Tp & __gam1, _Tp & __gam2, _Tp & __gampl, _Tp & __gammi)
     {
 #if _GLIBCXX_USE_C99_MATH_TR1
       __gampl = _Tp(1) / std::tr1::tgamma(_Tp(1) + __mu);
@@ -124,7 +124,7 @@ namespace tr1
      */
     template <typename _Tp>
     void
-    __bessel_jn(const _Tp __nu, const _Tp __x,
+    __bessel_jn(_Tp __nu, _Tp __x,
                 _Tp & __Jnu, _Tp & __Nnu, _Tp & __Jpnu, _Tp & __Npnu)
     {
       if (__x == _Tp(0))
@@ -349,11 +349,8 @@ namespace tr1
      */
     template <typename _Tp>
     void
-    __cyl_bessel_jn_asymp(const _Tp __nu, const _Tp __x,
-                          _Tp & __Jnu, _Tp & __Nnu)
+    __cyl_bessel_jn_asymp(_Tp __nu, _Tp __x, _Tp & __Jnu, _Tp & __Nnu)
     {
-      const _Tp __coef = std::sqrt(_Tp(2)
-                             / (__numeric_constants<_Tp>::__pi() * __x));
       const _Tp __mu   = _Tp(4) * __nu * __nu;
       const _Tp __mum1 = __mu - _Tp(1);
       const _Tp __mum9 = __mu - _Tp(9);
@@ -370,6 +367,8 @@ namespace tr1
       const _Tp __c = std::cos(__chi);
       const _Tp __s = std::sin(__chi);
 
+      const _Tp __coef = std::sqrt(_Tp(2)
+                             / (__numeric_constants<_Tp>::__pi() * __x));
       __Jnu = __coef * (__c * __P - __s * __Q);
       __Nnu = __coef * (__s * __P + __c * __Q);
 
@@ -406,10 +405,18 @@ namespace tr1
      */
     template <typename _Tp>
     _Tp
-    __cyl_bessel_ij_series(const _Tp __nu, const _Tp __x, const _Tp __sgn,
-                           const unsigned int __max_iter)
+    __cyl_bessel_ij_series(_Tp __nu, _Tp __x, _Tp __sgn,
+                           unsigned int __max_iter)
     {
-
+      if (__x == _Tp(0))
+       {
+          if (__nu == _Tp(0))
+            return _Tp(1);
+          else if (__nu == _Tp(1))
+            return _Tp(0);
+          else
+            return _Tp(0);
+       }
       const _Tp __x2 = __x / _Tp(2);
       _Tp __fact = __nu * std::log(__x2);
 #if _GLIBCXX_USE_C99_MATH_TR1
@@ -450,7 +457,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __cyl_bessel_j(const _Tp __nu, const _Tp __x)
+    __cyl_bessel_j(_Tp __nu, _Tp __x)
     {
       if (__nu < _Tp(0) || __x < _Tp(0))
         std::__throw_domain_error(__N("Bad argument "
@@ -492,7 +499,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __cyl_neumann_n(const _Tp __nu, const _Tp __x)
+    __cyl_neumann_n(_Tp __nu, _Tp __x)
     {
       if (__nu < _Tp(0) || __x < _Tp(0))
         std::__throw_domain_error(__N("Bad argument "
@@ -529,7 +536,7 @@ namespace tr1
      */
     template <typename _Tp>
     void
-    __sph_bessel_jn(const unsigned int __n, const _Tp __x,
+    __sph_bessel_jn(unsigned int __n, _Tp __x,
                     _Tp & __j_n, _Tp & __n_n, _Tp & __jp_n, _Tp & __np_n)
     {
       const _Tp __nu = _Tp(__n) + _Tp(0.5L);
@@ -564,7 +571,7 @@ namespace tr1
      */
     template <typename _Tp>
     _Tp
-    __sph_bessel(const unsigned int __n, const _Tp __x)
+    __sph_bessel(unsigned int __n, _Tp __x)
     {
       if (__x < _Tp(0))
         std::__throw_domain_error(__N("Bad argument "
@@ -602,7 +609,7 @@ namespace tr1
      */
     template <typename _Tp>
     _Tp
-    __sph_neumann(const unsigned int __n, const _Tp __x)
+    __sph_neumann(unsigned int __n, _Tp __x)
     {
       if (__x < _Tp(0))
         std::__throw_domain_error(__N("Bad argument "
index 7482cae0164ed440e3d10af7fd8e3aabe77c410d..b53076b02815e373e28ac1916881cf05f42bb254 100644 (file)
@@ -70,7 +70,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __ellint_rf(const _Tp __x, const _Tp __y, const _Tp __z)
+    __ellint_rf(_Tp __x, _Tp __y, _Tp __z)
     {
       const _Tp __min = std::numeric_limits<_Tp>::min();
       const _Tp __max = std::numeric_limits<_Tp>::max();
@@ -149,7 +149,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __comp_ellint_1_series(const _Tp __k)
+    __comp_ellint_1_series(_Tp __k)
     {
 
       const _Tp __kk = __k * __k;
@@ -187,7 +187,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __comp_ellint_1(const _Tp __k)
+    __comp_ellint_1(_Tp __k)
     {
 
       if (__isnan(__k))
@@ -215,7 +215,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __ellint_1(const _Tp __k, const _Tp __phi)
+    __ellint_1(_Tp __k, _Tp __phi)
     {
 
       if (__isnan(__k) || __isnan(__phi))
@@ -262,7 +262,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __comp_ellint_2_series(const _Tp __k)
+    __comp_ellint_2_series(_Tp __k)
     {
 
       const _Tp __kk = __k * __k;
@@ -310,7 +310,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __ellint_rd(const _Tp __x, const _Tp __y, const _Tp __z)
+    __ellint_rd(_Tp __x, _Tp __y, _Tp __z)
     {
       const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
       const _Tp __errtol = std::pow(__eps / _Tp(8), _Tp(1) / _Tp(6));
@@ -398,7 +398,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __comp_ellint_2(const _Tp __k)
+    __comp_ellint_2(_Tp __k)
     {
 
       if (__isnan(__k))
@@ -432,7 +432,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __ellint_2(const _Tp __k, const _Tp __phi)
+    __ellint_2(_Tp __k, _Tp __phi)
     {
 
       if (__isnan(__k) || __isnan(__phi))
@@ -491,7 +491,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __ellint_rc(const _Tp __x, const _Tp __y)
+    __ellint_rc(_Tp __x, _Tp __y)
     {
       const _Tp __min = std::numeric_limits<_Tp>::min();
       const _Tp __max = std::numeric_limits<_Tp>::max();
@@ -562,7 +562,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __ellint_rj(const _Tp __x, const _Tp __y, const _Tp __z, const _Tp __p)
+    __ellint_rj(_Tp __x, _Tp __y, _Tp __z, _Tp __p)
     {
       const _Tp __min = std::numeric_limits<_Tp>::min();
       const _Tp __max = std::numeric_limits<_Tp>::max();
@@ -666,7 +666,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __comp_ellint_3(const _Tp __k, const _Tp __nu)
+    __comp_ellint_3(_Tp __k, _Tp __nu)
     {
 
       if (__isnan(__k) || __isnan(__nu))
@@ -706,7 +706,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __ellint_3(const _Tp __k, const _Tp __nu, const _Tp __phi)
+    __ellint_3(_Tp __k, _Tp __nu, _Tp __phi)
     {
 
       if (__isnan(__k) || __isnan(__nu) || __isnan(__phi))
index 8c7fdce48e99ae84a5b99eaed7a4efda2d7ccb70..86c03a6ddc9f9826640497ca8e1a530eec122881 100644 (file)
@@ -58,7 +58,7 @@ namespace tr1
   {
   _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
-    template<typename _Tp> _Tp __expint_E1(const _Tp);
+    template<typename _Tp> _Tp __expint_E1(_Tp);
 
     /**
      *   @brief Return the exponential integral @f$ E_1(x) @f$
@@ -75,7 +75,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_E1_series(const _Tp __x)
+    __expint_E1_series(_Tp __x)
     {
       const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
       _Tp __term = _Tp(1);
@@ -112,7 +112,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_E1_asymp(const _Tp __x)
+    __expint_E1_asymp(_Tp __x)
     {
       _Tp __term = _Tp(1);
       _Tp __esum = _Tp(1);
@@ -149,7 +149,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_En_series(const unsigned int __n, const _Tp __x)
+    __expint_En_series(unsigned int __n, _Tp __x)
     {
       const unsigned int __max_iter = 100;
       const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
@@ -195,7 +195,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_En_cont_frac(const unsigned int __n, const _Tp __x)
+    __expint_En_cont_frac(unsigned int __n, _Tp __x)
     {
       const unsigned int __max_iter = 100;
       const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
@@ -240,7 +240,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_En_recursion(const unsigned int __n, const _Tp __x)
+    __expint_En_recursion(unsigned int __n, _Tp __x)
     {
       _Tp __En;
       _Tp __E1 = __expint_E1(__x);
@@ -284,7 +284,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_Ei_series(const _Tp __x)
+    __expint_Ei_series(_Tp __x)
     {
       _Tp __term = _Tp(1);
       _Tp __sum = _Tp(0);
@@ -315,7 +315,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_Ei_asymp(const _Tp __x)
+    __expint_Ei_asymp(_Tp __x)
     {
       _Tp __term = _Tp(1);
       _Tp __sum = _Tp(1);
@@ -348,7 +348,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_Ei(const _Tp __x)
+    __expint_Ei(_Tp __x)
     {
       if (__x < _Tp(0))
         return -__expint_E1(-__x);
@@ -372,7 +372,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_E1(const _Tp __x)
+    __expint_E1(_Tp __x)
     {
       if (__x < _Tp(0))
         return -__expint_Ei(-__x);
@@ -402,7 +402,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_asymp(const unsigned int __n, const _Tp __x)
+    __expint_asymp(unsigned int __n, _Tp __x)
     {
       _Tp __term = _Tp(1);
       _Tp __sum = _Tp(1);
@@ -436,7 +436,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint_large_n(const unsigned int __n, const _Tp __x)
+    __expint_large_n(unsigned int __n, _Tp __x)
     {
       const _Tp __xpn = __x + __n;
       const _Tp __xpn2 = __xpn * __xpn;
@@ -470,7 +470,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __expint(const unsigned int __n, const _Tp __x)
+    __expint(unsigned int __n, _Tp __x)
     {
       //  Return NaN on NaN input.
       if (__isnan(__x))
@@ -510,7 +510,7 @@ namespace tr1
      */
     template<typename _Tp>
     inline _Tp
-    __expint(const _Tp __x)
+    __expint(_Tp __x)
     {
       if (__isnan(__x))
         return std::numeric_limits<_Tp>::quiet_NaN();
index a642eec5638715d339d7984083ecff8dff579f31..7ec19a3ed38342685e93b10ff4b5ed5a12374210 100644 (file)
@@ -67,7 +67,8 @@ namespace tr1
      *   @return  The Bernoulli number of order n.
      */
     template <typename _Tp>
-    _Tp __bernoulli_series(unsigned int __n)
+    _Tp
+    __bernoulli_series(unsigned int __n)
     {
 
       static const _Tp __num[28] = {
@@ -130,10 +131,8 @@ namespace tr1
      */
     template<typename _Tp>
     inline _Tp
-    __bernoulli(const int __n)
-    {
-      return __bernoulli_series<_Tp>(__n);
-    }
+    __bernoulli(int __n)
+    { return __bernoulli_series<_Tp>(__n); }
 
 
     /**
@@ -146,7 +145,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __log_gamma_bernoulli(const _Tp __x)
+    __log_gamma_bernoulli(_Tp __x)
     {
       _Tp __lg = (__x - _Tp(0.5L)) * std::log(__x) - __x
                + _Tp(0.5L) * std::log(_Tp(2)
@@ -174,7 +173,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __log_gamma_lanczos(const _Tp __x)
+    __log_gamma_lanczos(_Tp __x)
     {
       const _Tp __xm1 = __x - _Tp(1);
 
@@ -218,7 +217,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __log_gamma(const _Tp __x)
+    __log_gamma(_Tp __x)
     {
       if (__x > _Tp(0.5L))
         return __log_gamma_lanczos(__x);
@@ -245,7 +244,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __log_gamma_sign(const _Tp __x)
+    __log_gamma_sign(_Tp __x)
     {
       if (__x > _Tp(0))
         return _Tp(1);
@@ -276,7 +275,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __log_bincoef(const unsigned int __n, const unsigned int __k)
+    __log_bincoef(unsigned int __n, unsigned int __k)
     {
       //  Max e exponent before overflow.
       static const _Tp __max_bincoeff
@@ -307,7 +306,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __bincoef(const unsigned int __n, const unsigned int __k)
+    __bincoef(unsigned int __n, unsigned int __k)
     {
       //  Max e exponent before overflow.
       static const _Tp __max_bincoeff
@@ -330,10 +329,8 @@ namespace tr1
      */
     template<typename _Tp>
     inline _Tp
-    __gamma(const _Tp __x)
-    {
-      return std::exp(__log_gamma(__x));
-    }
+    __gamma(_Tp __x)
+    { return std::exp(__log_gamma(__x)); }
 
 
     /**
@@ -351,7 +348,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __psi_series(const _Tp __x)
+    __psi_series(_Tp __x)
     {
       _Tp __sum = -__numeric_constants<_Tp>::__gamma_e() - _Tp(1) / __x;
       const unsigned int __max_iter = 100000;
@@ -381,7 +378,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __psi_asymp(const _Tp __x)
+    __psi_asymp(_Tp __x)
     {
       _Tp __sum = std::log(__x) - _Tp(0.5L) / __x;
       const _Tp __xx = __x * __x;
@@ -412,7 +409,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __psi(const _Tp __x)
+    __psi(_Tp __x)
     {
       const int __n = static_cast<int>(__x + 0.5L);
       const _Tp __eps = _Tp(4) * std::numeric_limits<_Tp>::epsilon();
@@ -441,7 +438,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __psi(const unsigned int __n, const _Tp __x)
+    __psi(unsigned int __n, _Tp __x)
     {
       if (__x <= _Tp(0))
         std::__throw_domain_error(__N("Argument out of range "
index cfe03a96622fc0d3aa8f80257d45d0d01a0b9419..14f7258ac4b974326dd81e2aba6954c05e4007a5 100644 (file)
@@ -75,7 +75,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __conf_hyperg_series(const _Tp __a, const _Tp __c, const _Tp __x)
+    __conf_hyperg_series(_Tp __a, _Tp __c, _Tp __x)
     {
       const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
 
@@ -112,7 +112,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __conf_hyperg_luke(const _Tp __a, const _Tp __c, const _Tp __xin)
+    __conf_hyperg_luke(_Tp __a, _Tp __c, _Tp __xin)
     {
       const _Tp __big = std::pow(std::numeric_limits<_Tp>::max(), _Tp(0.16L));
       const int __nmax = 20000;
@@ -218,8 +218,8 @@ namespace tr1
      *   @return  The confluent hypergeometric function.
      */
     template<typename _Tp>
-    inline _Tp
-    __conf_hyperg(const _Tp __a, const _Tp __c, const _Tp __x)
+    _Tp
+    __conf_hyperg(_Tp __a, _Tp __c, _Tp __x)
     {
 #if _GLIBCXX_USE_C99_MATH_TR1
       const _Tp __c_nint = std::tr1::nearbyint(__c);
@@ -263,8 +263,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __hyperg_series(const _Tp __a, const _Tp __b,
-                    const _Tp __c, const _Tp __x)
+    __hyperg_series(_Tp __a, _Tp __b, _Tp __c, _Tp __x)
     {
       const _Tp __eps = std::numeric_limits<_Tp>::epsilon();
 
@@ -297,8 +296,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __hyperg_luke(const _Tp __a, const _Tp __b, const _Tp __c,
-                  const _Tp __xin)
+    __hyperg_luke(_Tp __a, _Tp __b, _Tp __c, _Tp __xin)
     {
       const _Tp __big = std::pow(std::numeric_limits<_Tp>::max(), _Tp(0.16L));
       const int __nmax = 20000;
@@ -432,8 +430,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __hyperg_reflect(const _Tp __a, const _Tp __b, const _Tp __c,
-                     const _Tp __x)
+    __hyperg_reflect(_Tp __a, _Tp __b, _Tp __c, _Tp __x)
     {
       const _Tp __d = __c - __a - __b;
       const int __intd  = std::floor(__d + _Tp(0.5L));
@@ -722,8 +719,8 @@ namespace tr1
      *   @return  The confluent hypergeometric function.
      */
     template<typename _Tp>
-    inline _Tp
-    __hyperg(const _Tp __a, const _Tp __b, const _Tp __c, const _Tp __x)
+    _Tp
+    __hyperg(_Tp __a, _Tp __b, _Tp __c, _Tp __x)
     {
 #if _GLIBCXX_USE_C99_MATH_TR1
       const _Tp __a_nint = std::tr1::nearbyint(__a);
index 89bf26790f9f9c966394667fb619c1d285ac539c..bfecf00af591c40c2e97768fc0c16423ff6af20f 100644 (file)
@@ -72,7 +72,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __poly_legendre_p(const unsigned int __l, const _Tp __x)
+    __poly_legendre_p(unsigned int __l, _Tp __x)
     {
 
       if ((__x < _Tp(-1)) || (__x > _Tp(+1)))
@@ -129,8 +129,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __assoc_legendre_p(const unsigned int __l, const unsigned int __m,
-                       const _Tp __x)
+    __assoc_legendre_p(unsigned int __l, unsigned int __m, _Tp __x)
     {
 
       if (__x < _Tp(-1) || __x > _Tp(+1))
@@ -209,8 +208,7 @@ namespace tr1
      */
     template <typename _Tp>
     _Tp
-    __sph_legendre(const unsigned int __l, const unsigned int __m,
-                   const _Tp __theta)
+    __sph_legendre(unsigned int __l, unsigned int __m, _Tp __theta)
     {
       if (__isnan(__theta))
         return std::numeric_limits<_Tp>::quiet_NaN();
index 8e4d5b9c749a809eae38108c3f358c1a1a24f68d..3d1fb904a038fd5217c9fd67f509783129fc6792 100644 (file)
@@ -77,7 +77,7 @@ namespace tr1
      */
     template <typename _Tp>
     void
-    __bessel_ik(const _Tp __nu, const _Tp __x,
+    __bessel_ik(_Tp __nu, _Tp __x,
                 _Tp & __Inu, _Tp & __Knu, _Tp & __Ipnu, _Tp & __Kpnu)
     {
       if (__x == _Tp(0))
@@ -132,7 +132,7 @@ namespace tr1
         }
       if (__i > __max_iter)
         std::__throw_runtime_error(__N("Argument x too large "
-                                       "in __bessel_jn; "
+                                       "in __bessel_ik; "
                                        "try asymptotic expansion."));
       _Tp __Inul = __fp_min;
       _Tp __Ipnul = __h * __Inul;
@@ -185,7 +185,7 @@ namespace tr1
             }
           if (__i > __max_iter)
             std::__throw_runtime_error(__N("Bessel k series failed to converge "
-                                           "in __bessel_jn."));
+                                           "in __bessel_ik."));
           __Kmu = __sum;
           __Knu1 = __sum1 * __xi2;
         }
@@ -221,7 +221,7 @@ namespace tr1
             }
           if (__i > __max_iter)
             std::__throw_runtime_error(__N("Steed's method failed "
-                                           "in __bessel_jn."));
+                                           "in __bessel_ik."));
           __h = __a1 * __h;
           __Kmu = std::sqrt(__numeric_constants<_Tp>::__pi() / (_Tp(2) * __x))
                 * std::exp(-__x) / __s;
@@ -261,7 +261,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __cyl_bessel_i(const _Tp __nu, const _Tp __x)
+    __cyl_bessel_i(_Tp __nu, _Tp __x)
     {
       if (__nu < _Tp(0) || __x < _Tp(0))
         std::__throw_domain_error(__N("Bad argument "
@@ -297,7 +297,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __cyl_bessel_k(const _Tp __nu, const _Tp __x)
+    __cyl_bessel_k(_Tp __nu, _Tp __x)
     {
       if (__nu < _Tp(0) || __x < _Tp(0))
         std::__throw_domain_error(__N("Bad argument "
@@ -331,7 +331,7 @@ namespace tr1
      */
     template <typename _Tp>
     void
-    __sph_bessel_ik(const unsigned int __n, const _Tp __x,
+    __sph_bessel_ik(unsigned int __n, _Tp __x,
                     _Tp & __i_n, _Tp & __k_n, _Tp & __ip_n, _Tp & __kp_n)
     {
       const _Tp __nu = _Tp(__n) + _Tp(0.5L);
@@ -366,8 +366,7 @@ namespace tr1
      */
     template <typename _Tp>
     void
-    __airy(const _Tp __x,
-           _Tp & __Ai, _Tp & __Bi, _Tp & __Aip, _Tp & __Bip)
+    __airy(_Tp __x, _Tp & __Ai, _Tp & __Bi, _Tp & __Aip, _Tp & __Bip)
     {
       const _Tp __absx = std::abs(__x);
       const _Tp __rootx = std::sqrt(__absx);
index 3be3d6da30acbc815f14830894c010ce24b651a3..1f05f79dd9102718a0124acfc90d2e23f233b6c6 100644 (file)
@@ -66,7 +66,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __poly_hermite_recursion(const unsigned int __n, const _Tp __x)
+    __poly_hermite_recursion(unsigned int __n, _Tp __x)
     {
       //  Compute H_0.
       _Tp __H_0 = 1;
@@ -108,7 +108,7 @@ namespace tr1
      */
     template<typename _Tp>
     inline _Tp
-    __poly_hermite(const unsigned int __n, const _Tp __x)
+    __poly_hermite(unsigned int __n, _Tp __x)
     {
       if (__isnan(__x))
         return std::numeric_limits<_Tp>::quiet_NaN();
index 066888a4d950095e80a355e548450d657b4ac906..99d4a153984e3c0e123f121ceb3891ae73646362 100644 (file)
@@ -67,8 +67,7 @@ namespace tr1
      */
     template<typename _Tpa, typename _Tp>
     _Tp
-    __poly_laguerre_large_n(const unsigned __n, const _Tpa __alpha1,
-                            const _Tp __x)
+    __poly_laguerre_large_n(unsigned __n, _Tpa __alpha1, _Tp __x)
     {
       const _Tp __a = -_Tp(__n);
       const _Tp __b = _Tp(__alpha1) + _Tp(1);
@@ -122,8 +121,7 @@ namespace tr1
      */
     template<typename _Tpa, typename _Tp>
     _Tp
-    __poly_laguerre_hyperg(const unsigned int __n, const _Tpa __alpha1,
-                          const _Tp __x)
+    __poly_laguerre_hyperg(unsigned int __n, _Tpa __alpha1, _Tp __x)
     {
       const _Tp __b = _Tp(__alpha1) + _Tp(1);
       const _Tp __mx = -__x;
@@ -179,8 +177,7 @@ namespace tr1
      */
     template<typename _Tpa, typename _Tp>
     _Tp
-    __poly_laguerre_recursion(const unsigned int __n,
-                              const _Tpa __alpha1, const _Tp __x)
+    __poly_laguerre_recursion(unsigned int __n, _Tpa __alpha1, _Tp __x)
     {
       //   Compute l_0.
       _Tp __l_0 = _Tp(1);
@@ -238,9 +235,8 @@ namespace tr1
      *           degree @f$ \alpha @f$, and argument x.
      */
     template<typename _Tpa, typename _Tp>
-    inline _Tp
-    __poly_laguerre(const unsigned int __n, const _Tpa __alpha1,
-                    const _Tp __x)
+    _Tp
+    __poly_laguerre(unsigned int __n, _Tpa __alpha1, _Tp __x)
     {
       if (__x < _Tp(0))
         std::__throw_domain_error(__N("Negative argument "
@@ -292,11 +288,8 @@ namespace tr1
      */
     template<typename _Tp>
     inline _Tp
-    __assoc_laguerre(const unsigned int __n, const unsigned int __m,
-                     const _Tp __x)
-    {
-      return __poly_laguerre<unsigned int, _Tp>(__n, __m, __x);
-    }
+    __assoc_laguerre(unsigned int __n, unsigned int __m, _Tp __x)
+    { return __poly_laguerre<unsigned int, _Tp>(__n, __m, __x); }
 
 
     /**
@@ -315,10 +308,8 @@ namespace tr1
      */
     template<typename _Tp>
     inline _Tp
-    __laguerre(const unsigned int __n, const _Tp __x)
-    {
-      return __poly_laguerre<unsigned int, _Tp>(__n, 0, __x);
-    }
+    __laguerre(unsigned int __n, _Tp __x)
+    { return __poly_laguerre<unsigned int, _Tp>(__n, 0, __x); }
 
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace std::tr1::__detail
index 4a1e462e713a8c5a00d7a210514837f3ae1c00d6..4023204c543d934b1dd3fdd3a9880bee43d32ab0 100644 (file)
@@ -70,7 +70,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __riemann_zeta_sum(const _Tp __s)
+    __riemann_zeta_sum(_Tp __s)
     {
       //  A user shouldn't get to this.
       if (__s < _Tp(1))
@@ -107,7 +107,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __riemann_zeta_alt(const _Tp __s)
+    __riemann_zeta_alt(_Tp __s)
     {
       _Tp __sgn = _Tp(1);
       _Tp __zeta = _Tp(0);
@@ -149,7 +149,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __riemann_zeta_glob(const _Tp __s)
+    __riemann_zeta_glob(_Tp __s)
     {
       _Tp __zeta = _Tp(0);
 
@@ -244,7 +244,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __riemann_zeta_product(const _Tp __s)
+    __riemann_zeta_product(_Tp __s)
     {
       static const _Tp __prime[] = {
         _Tp(2), _Tp(3), _Tp(5), _Tp(7), _Tp(11), _Tp(13), _Tp(17), _Tp(19),
@@ -285,7 +285,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __riemann_zeta(const _Tp __s)
+    __riemann_zeta(_Tp __s)
     {
       if (__isnan(__s))
         return std::numeric_limits<_Tp>::quiet_NaN();
@@ -357,7 +357,7 @@ namespace tr1
      */
     template<typename _Tp>
     _Tp
-    __hurwitz_zeta_glob(const _Tp __a, const _Tp __s)
+    __hurwitz_zeta_glob(_Tp __a, _Tp __s)
     {
       _Tp __zeta = _Tp(0);
 
@@ -422,10 +422,8 @@ namespace tr1
      */
     template<typename _Tp>
     inline _Tp
-    __hurwitz_zeta(const _Tp __a, const _Tp __s)
-    {
-      return __hurwitz_zeta_glob(__a, __s);
-    }
+    __hurwitz_zeta(_Tp __a, _Tp __s)
+    { return __hurwitz_zeta_glob(__a, __s); }
 
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace std::tr1::__detail
index 3bb36a19ee8806ac64e7d92c108a4faa3249326a..abec0506c01ca4ab03b61440ea004c07879a6fd1 100644 (file)
@@ -107,30 +107,22 @@ namespace tr1
     /// out of intrinsics, this will disappear completely in favor of
     /// std::isnan.
     template<typename _Tp>
-    inline bool __isnan(const _Tp __x)
-    {
-      return std::isnan(__x);
-    }
+    inline bool __isnan(_Tp __x)
+    { return std::isnan(__x); }
 
 #else
 
     template<typename _Tp>
     inline bool __isnan(const _Tp __x)
-    {
-      return __builtin_isnan(__x);
-    }
+    { return __builtin_isnan(__x); }
 
     template<>
-    inline bool __isnan<float>(const float __x)
-    {
-      return __builtin_isnanf(__x);
-    }
+    inline bool __isnan<float>(float __x)
+    { return __builtin_isnanf(__x); }
 
     template<>
-    inline bool __isnan<long double>(const long double __x)
-    {
-      return __builtin_isnanl(__x);
-    }
+    inline bool __isnan<long double>(long double __x)
+    { return __builtin_isnanl(__x); }
 
 #endif
 
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/special_functions/08_cyl_bessel_i/pr56216.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/special_functions/08_cyl_bessel_i/pr56216.cc
new file mode 100644 (file)
index 0000000..41afe5e
--- /dev/null
@@ -0,0 +1,47 @@
+// 2013-02-08  Edward Smith-Rowland <3dw4rd@verizon.net>
+//
+// Copyright (C) 2013 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/>.
+
+// PR libstdc++/56216 - Crash of Bessel functions at x==0!
+
+#include <testsuite_hooks.h>
+#include <tr1/cmath>
+
+void
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  double j0 = std::tr1::cyl_bessel_j(0.0, 0.0);
+  double i0 = std::tr1::cyl_bessel_i(0.0, 0.0);
+  double j1 = std::tr1::cyl_bessel_j(1.0, 0.0);
+  double i1 = std::tr1::cyl_bessel_i(1.0, 0.0);
+
+  VERIFY(j0 == 1.0);
+  VERIFY(i0 == 1.0);
+  VERIFY(j1 == 0.0);
+  VERIFY(i1 == 0.0);
+}
+
+int
+main()
+{
+  test01();
+
+  return 0;
+}