Enable Mathematical Special Functions for C++17
authorJonathan Wakely <jwakely@redhat.com>
Wed, 3 Aug 2016 15:54:13 +0000 (16:54 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 3 Aug 2016 15:54:13 +0000 (16:54 +0100)
* include/bits/c++config (_GLIBCXX_USE_STD_SPEC_FUNCS): Define for
C++17, or for C++11/C++14 when __STDCPP_WANT_MATH_SPEC_FUNCS__ is
true.
* include/bits/specfun.h [!__STDCPP_WANT_MATH_SPEC_FUNCS__]: Don't
do #error for C++17.
* include/c_global/cmath: Check _GLIBCXX_USE_STD_SPEC_FUNCS instead
of __STDCPP_WANT_MATH_SPEC_FUNCS__.
* include/tr1/bessel_function.tcc: Likewise.
* include/tr1/beta_function.tcc: Likewise.
* include/tr1/cmath: Likewise.
* include/tr1/ell_integral.tcc: Likewise.
* include/tr1/exp_integral.tcc: Likewise.
* include/tr1/gamma.tcc: Likewise.
* include/tr1/hypergeometric.tcc: Likewise.
* include/tr1/legendre_function.tcc: Likewise.
* include/tr1/modified_bessel_func.tcc: Likewise.
* include/tr1/poly_hermite.tcc: Likewise.
* include/tr1/poly_laguerre.tcc: Likewise.
* include/tr1/riemann_zeta.tcc: Likewise.
* include/tr1/special_function_util.h: Likewise.
* testsuite/26_numerics/headers/cmath/functions_std_c++17.cc: New.

From-SVN: r239081

18 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/c++config
libstdc++-v3/include/bits/specfun.h
libstdc++-v3/include/c_global/cmath
libstdc++-v3/include/tr1/bessel_function.tcc
libstdc++-v3/include/tr1/beta_function.tcc
libstdc++-v3/include/tr1/cmath
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/26_numerics/headers/cmath/functions_std_c++17.cc [new file with mode: 0644]

index c6b5ec3d3d1e43df795b5a3a589c3b4f788465da..d6082300e32dd01775db2f61eafd15aa482f6b18 100644 (file)
@@ -1,5 +1,27 @@
 2016-08-03  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/bits/c++config (_GLIBCXX_USE_STD_SPEC_FUNCS): Define for
+       C++17, or for C++11/C++14 when __STDCPP_WANT_MATH_SPEC_FUNCS__ is
+       true.
+       * include/bits/specfun.h [!__STDCPP_WANT_MATH_SPEC_FUNCS__]: Don't
+       do #error for C++17.
+       * include/c_global/cmath: Check _GLIBCXX_USE_STD_SPEC_FUNCS instead
+       of __STDCPP_WANT_MATH_SPEC_FUNCS__.
+       * include/tr1/bessel_function.tcc: Likewise.
+       * include/tr1/beta_function.tcc: Likewise.
+       * include/tr1/cmath: Likewise.
+       * include/tr1/ell_integral.tcc: Likewise.
+       * include/tr1/exp_integral.tcc: Likewise.
+       * include/tr1/gamma.tcc: Likewise.
+       * include/tr1/hypergeometric.tcc: Likewise.
+       * include/tr1/legendre_function.tcc: Likewise.
+       * include/tr1/modified_bessel_func.tcc: Likewise.
+       * include/tr1/poly_hermite.tcc: Likewise.
+       * include/tr1/poly_laguerre.tcc: Likewise.
+       * include/tr1/riemann_zeta.tcc: Likewise.
+       * include/tr1/special_function_util.h: Likewise.
+       * testsuite/26_numerics/headers/cmath/functions_std_c++17.cc: New.
+
        * include/std/type_traits (has_trivial_default_constructor): Remove.
        (has_trivial_copy_constructor, has_trivial_copy_assign): Likewise.
        * testsuite/20_util/has_trivial_copy_assign/requirements/
index 462560742517b3600c744da82a1fca17c9dc4886..8d2c3612afd0d1b4b788cc7b841c82c5bedd2634 100644 (file)
@@ -532,6 +532,13 @@ namespace std
 #define _GLIBCXX_TXN_SAFE_DYN
 #endif
 
+#if __cplusplus > 201402L
+// In C++17 mathematical special functions are in namespace std.
+# define _GLIBCXX_USE_STD_SPEC_FUNCS 1
+#elif __cplusplus >= 201103L && __STDCPP_WANT_MATH_SPEC_FUNCS__ != 0
+// For C++11 and C++14 they are in namespace std when requested.
+# define _GLIBCXX_USE_STD_SPEC_FUNCS 1
+#endif
 
 // The remainder of the prewritten config is automatic; all the
 // user hooks are listed above.
index 9f7bb87d2d3a64f4033be1374cf27da74baf0da4..93e18522d58b640b91c1103f781a3bd851c43bd8 100644 (file)
@@ -38,7 +38,7 @@
 
 #define __cpp_lib_math_special_functions 201603L
 
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__ == 0
+#if __cplusplus <= 201403L && __STDCPP_WANT_MATH_SPEC_FUNCS__ == 0
 # error include <cmath> and define __STDCPP_WANT_MATH_SPEC_FUNCS__
 #endif
 
index 6a24ebfec5b84922ec6ebc4da5d3d2e50a1758a6..6db9deeb996b6bbbeb1ca370dfb2f7972d5a457c 100644 (file)
@@ -1790,7 +1790,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
 
 #endif // C++11
 
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__ == 1
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 #  include <bits/specfun.h>
 #endif
 
index a2655d88b991ae418b2fde67a4269035fd41396e..692f6da34f5efe7fe13a27ea451ffffc0ae639e2 100644 (file)
@@ -50,7 +50,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 # define _GLIBCXX_MATH_NS ::std
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
@@ -630,7 +630,7 @@ namespace tr1
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
 #undef _GLIBCXX_MATH_NS
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index 76f5093cbec5a5878b4128c001bd451152edb5c2..34b22d4ea21a70715b14a7a236205938b8f4aa14 100644 (file)
@@ -48,7 +48,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 # define _GLIBCXX_MATH_NS ::std
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
@@ -199,7 +199,7 @@ namespace tr1
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
 #undef _GLIBCXX_MATH_NS
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index 48466a02854e5d7235f16854b9e7de1a225da6a7..7f77a2b01ad741be71738576fd3330cf329d0691 100644 (file)
@@ -1141,7 +1141,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
 }
 }
 
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
@@ -1254,7 +1254,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
 }
 }
 
-#else // ! __STDCPP_WANT_MATH_SPEC_FUNCS__
+#else // ! _GLIBCXX_USE_STD_SPEC_FUNCS
 
 #include <bits/stl_algobase.h>
 #include <limits>
@@ -1683,6 +1683,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 _GLIBCXX_END_NAMESPACE_VERSION
 }
 }
-#endif // __STDCPP_WANT_MATH_SPEC_FUNCS__
+#endif // _GLIBCXX_USE_STD_SPEC_FUNCS
 
 #endif // _GLIBCXX_TR1_CMATH
index 9a60ba3b00a5e05b4a56105fc8be28987325b388..c7bfe16fb789c4684704714581c06cf4557c8667 100644 (file)
@@ -44,7 +44,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
 {
@@ -748,7 +748,7 @@ namespace tr1
 
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index ee7cdad6d919fbe85da1fa9ec6e5c031ec50d56e..f5b30941ee47a08169f9e61d864c780e07feb217 100644 (file)
@@ -49,7 +49,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
 {
@@ -525,7 +525,7 @@ namespace tr1
 
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index 2c84b7521a302d9f28e5e91b387a0ae879da9ce2..3eb78455823c15945249802743808ff4e22f1adc 100644 (file)
@@ -50,7 +50,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 # define _GLIBCXX_MATH_NS ::std
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
@@ -470,7 +470,7 @@ namespace tr1
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
 #undef _GLIBCXX_MATH_NS
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 } // namespace std
index 77fb78d058b15f7685b38f9645c6bdaeead3a253..1c46f4ac2b4f76333499e36c13b865923d3cc99b 100644 (file)
@@ -43,7 +43,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 # define _GLIBCXX_MATH_NS ::std
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
@@ -777,7 +777,7 @@ namespace tr1
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
 #undef _GLIBCXX_MATH_NS
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index d5f20223b31a300b9c2ae4e53a49c2c635563cb5..1980ebbf0c14054b775b14705af22ba1a32921d9 100644 (file)
@@ -48,7 +48,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 # define _GLIBCXX_MATH_NS ::std
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
@@ -305,7 +305,7 @@ namespace tr1
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
 #undef _GLIBCXX_MATH_NS
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index 0162727b34c8a53844d2f25a49498420ab959191..5278fb2778e5ae4acf31f4265329eabc84532b70 100644 (file)
@@ -50,7 +50,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
 {
@@ -433,7 +433,7 @@ namespace tr1
 
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index a5a6bcbd8d06d372089f448ddcc56242827c2b3d..7123e11e7f1f4703351b9bea95e6f376255a48c1 100644 (file)
@@ -41,7 +41,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
 {
@@ -123,7 +123,7 @@ namespace tr1
 
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index 6c757e40c111f1970aa695fd0bc8ead5a6623ea4..a51d1dcc9c11dc0f1d3c135ab17d1f5bc95e92d6 100644 (file)
@@ -43,7 +43,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 # define _GLIBCXX_MATH_NS ::std
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
@@ -321,7 +321,7 @@ namespace tr1
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
 #undef _GLIBCXX_MATH_NS
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index f411b20e61196a87a73cba652cca1a616eeabaed..714bf9f1450dbe98f884f8d9cae1d5b539b917cb 100644 (file)
@@ -46,7 +46,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 # define _GLIBCXX_MATH_NS ::std
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
@@ -435,7 +435,7 @@ namespace tr1
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
 #undef _GLIBCXX_MATH_NS
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
index 2b8cf377e4ec0cca6049d94cb82a1993a044abf7..93f09cea80502a719159a5b1dfab7719ac1170ec 100644 (file)
@@ -38,7 +38,7 @@
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
-#if __STDCPP_WANT_MATH_SPEC_FUNCS__
+#if _GLIBCXX_USE_STD_SPEC_FUNCS
 #elif defined(_GLIBCXX_TR1_CMATH)
 namespace tr1
 {
@@ -133,7 +133,7 @@ namespace tr1
 
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace __detail
-#if ! __STDCPP_WANT_MATH_SPEC_FUNCS__ && defined(_GLIBCXX_TR1_CMATH)
+#if ! _GLIBCXX_USE_STD_SPEC_FUNCS && defined(_GLIBCXX_TR1_CMATH)
 } // namespace tr1
 #endif
 }
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cmath/functions_std_c++17.cc b/libstdc++-v3/testsuite/26_numerics/headers/cmath/functions_std_c++17.cc
new file mode 100644 (file)
index 0000000..481b659
--- /dev/null
@@ -0,0 +1,111 @@
+// Copyright (C) 2016 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/>.
+
+// { dg-options "-std=gnu++17" }
+// { dg-do compile }
+
+#include <cmath>
+
+namespace gnu
+{
+  using std::acos;
+  using std::asin;
+  using std::atan;
+  using std::atan2;
+  using std::ceil;
+  using std::cos;
+  using std::cosh;
+  using std::exp;
+  using std::fabs;
+  using std::floor;
+  using std::fmod;
+  using std::frexp;
+  using std::ldexp;
+  using std::log;
+  using std::log10;
+  using std::modf;
+  using std::pow;
+  using std::sin;
+  using std::sinh;
+  using std::sqrt;
+  using std::tan;
+  using std::tanh;
+
+  using std::assoc_laguerre;
+  using std::assoc_laguerref;
+  using std::assoc_laguerrel;
+  using std::assoc_legendre;
+  using std::assoc_legendref;
+  using std::assoc_legendrel;
+  using std::beta;
+  using std::betaf;
+  using std::betal;
+  using std::comp_ellint_1;
+  using std::comp_ellint_1f;
+  using std::comp_ellint_1l;
+  using std::comp_ellint_2;
+  using std::comp_ellint_2f;
+  using std::comp_ellint_2l;
+  using std::comp_ellint_3;
+  using std::comp_ellint_3f;
+  using std::comp_ellint_3l;
+  using std::cyl_bessel_i;
+  using std::cyl_bessel_if;
+  using std::cyl_bessel_il;
+  using std::cyl_bessel_j;
+  using std::cyl_bessel_jf;
+  using std::cyl_bessel_jl;
+  using std::cyl_bessel_k;
+  using std::cyl_bessel_kf;
+  using std::cyl_bessel_kl;
+  using std::cyl_neumann;
+  using std::cyl_neumannf;
+  using std::cyl_neumannl;
+  using std::ellint_1;
+  using std::ellint_1f;
+  using std::ellint_1l;
+  using std::ellint_2;
+  using std::ellint_2f;
+  using std::ellint_2l;
+  using std::ellint_3;
+  using std::ellint_3f;
+  using std::ellint_3l;
+  using std::expint;
+  using std::expintf;
+  using std::expintl;
+  using std::hermite;
+  using std::hermitef;
+  using std::hermitel;
+  using std::laguerre;
+  using std::laguerref;
+  using std::laguerrel;
+  using std::legendre;
+  using std::legendref;
+  using std::legendrel;
+  using std::riemann_zeta;
+  using std::riemann_zetaf;
+  using std::riemann_zetal;
+  using std::sph_bessel;
+  using std::sph_besself;
+  using std::sph_bessell;
+  using std::sph_legendre;
+  using std::sph_legendref;
+  using std::sph_legendrel;
+  using std::sph_neumann;
+  using std::sph_neumannf;
+  using std::sph_neumannl;
+}