diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2023-05-13 00:57:15 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2023-05-31 21:01:16 +0100 |
commit | 1f378f6dd33ad5067a437d1c456979f8662020d6 (patch) | |
tree | 255394acfc51f529940024c77bebc8c61cc01c32 /libstdc++-v3/acinclude.m4 | |
parent | fb409a15d9babc78fe1d9957afcbaf1102cce58f (diff) | |
download | gcc-1f378f6dd33ad5067a437d1c456979f8662020d6.zip gcc-1f378f6dd33ad5067a437d1c456979f8662020d6.tar.gz gcc-1f378f6dd33ad5067a437d1c456979f8662020d6.tar.bz2 |
libstdc++: Stop using _GLIBCXX_USE_C99_MATH_TR1 in <cmath>
Similar to the three commits r14-908, r14-909 and r14-910, the
_GLIBCXX_USE_C99_MATH_TR1 macro is misleading when it is also used for
<cmath>, not only for <tr1/cmath> headers. It is also wrong, because the
configure checks for TR1 use -std=c++98 and a target might define the
C99 features for C++11 but not for C++98.
Add separate configure checks for the <math.h> functions using
-std=c++11 for the checks. Use the new macro defined by those checks in
the C++11-specific parts of <cmath>, and in <complex>, <random> etc.
The check that defines _GLIBCXX_NO_C99_ROUNDING_FUNCS is only needed for
the C++11 <cmath> checks, so remove that from GLIBCXX_CHECK_C99_TR1 and
only do it for GLIBCXX_ENABLE_C99.
libstdc++-v3/ChangeLog:
* acinclude.m4 (GLIBCXX_ENABLE_C99): Add checks for C99 math
functions and define _GLIBCXX_USE_C99_MATH_FUNCS. Move checks
for C99 rounding functions to here.
(GLIBCXX_CHECK_C99_TR1): Remove checks for C99 rounding
functions from here.
* config.h.in: Regenerate.
* configure: Regenerate.
* include/bits/random.h: Use _GLIBCXX_USE_C99_MATH_FUNCS instead
of _GLIBCXX_USE_C99_MATH_TR1.
* include/bits/random.tcc: Likewise.
* include/c_compatibility/math.h: Likewise.
* include/c_global/cmath: Likewise.
* include/ext/random: Likewise.
* include/ext/random.tcc: Likewise.
* include/std/complex: Likewise.
* testsuite/20_util/from_chars/4.cc: Likewise.
* testsuite/20_util/from_chars/8.cc: Likewise.
* testsuite/26_numerics/complex/proj.cc: Likewise.
* testsuite/26_numerics/headers/cmath/60401.cc: Likewise.
* testsuite/26_numerics/headers/cmath/types_std_c++0x.cc:
Likewise.
* testsuite/lib/libstdc++.exp (check_v3_target_cstdint):
Likewise.
* testsuite/util/testsuite_random.h: Likewise.
Diffstat (limited to 'libstdc++-v3/acinclude.m4')
-rw-r--r-- | libstdc++-v3/acinclude.m4 | 183 |
1 files changed, 158 insertions, 25 deletions
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index ca77697..6619407 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -1245,8 +1245,8 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [ imported in <cinttypes> in namespace std in C++11.]) fi - # Check for the existence of <math.h> functions used if C99 is enabled. - AC_CACHE_CHECK([for ISO C99 support in <math.h> for C++11], + # Check for the existence of <math.h> generic macros used if C99 is enabled. + AC_CACHE_CHECK([for ISO C99 generic macro support in <math.h> for C++11], glibcxx_cv_c99_math_cxx11, [ GCC_TRY_COMPILE_OR_LINK( [#include <math.h> @@ -1269,10 +1269,165 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [ ]) if test x"$glibcxx_cv_c99_math_cxx11" = x"yes"; then AC_DEFINE(_GLIBCXX11_USE_C99_MATH, 1, - [Define if C99 functions or macros in <math.h> should be imported + [Define if C99 generic macros in <math.h> should be imported in <cmath> in namespace std for C++11.]) fi + # Check for the existence of <math.h> functions. + AC_CACHE_CHECK([for ISO C99 function support for C++11 in <math.h>], + glibcxx_cv_c99_math_funcs, [ + AC_TRY_COMPILE([#include <math.h>], + [// Types + typedef double_t my_double_t; + typedef float_t my_float_t; + // Hyperbolic + acosh(0.0); + acoshf(0.0f); + acoshl(0.0l); + asinh(0.0); + asinhf(0.0f); + asinhl(0.0l); + atanh(0.0); + atanhf(0.0f); + atanhl(0.0l); + // Exponential and logarithmic + exp2(0.0); + exp2f(0.0f); + exp2l(0.0l); + expm1(0.0); + expm1f(0.0f); + expm1l(0.0l); + ilogb(0.0); + ilogbf(0.0f); + ilogbl(0.0l); + log1p(0.0); + log1pf(0.0f); + log1pl(0.0l); + log2(0.0); + log2f(0.0f); + log2l(0.0l); + logb(0.0); + logbf(0.0f); + logbl(0.0l); + scalbln(0.0, 0l); + scalblnf(0.0f, 0l); + scalblnl(0.0l, 0l); + scalbn(0.0, 0); + scalbnf(0.0f, 0); + scalbnl(0.0l, 0); + // Power and absolute-value + cbrt(0.0); + cbrtf(0.0f); + cbrtl(0.0l); + hypot(0.0, 0.0); + hypotf(0.0f, 0.0f); + hypotl(0.0l, 0.0l); + // Error and gamma + erf(0.0); + erff(0.0f); + erfl(0.0l); + erfc(0.0); + erfcf(0.0f); + erfcl(0.0l); + lgamma(0.0); + lgammaf(0.0f); + lgammal(0.0l); + tgamma(0.0); + tgammaf(0.0f); + tgammal(0.0l); + // Nearest integer + nearbyint(0.0); + nearbyintf(0.0f); + nearbyintl(0.0l); + rint(0.0); + rintf(0.0f); + rintl(0.0l); + round(0.0); + roundf(0.0f); + roundl(0.0l); + lrint(0.0); + lrintf(0.0f); + lrintl(0.0l); + lround(0.0); + lroundf(0.0f); + lroundl(0.0l); + #ifndef __APPLE__ /* see below */ + llrint(0.0); + llrintf(0.0f); + llrintl(0.0l); + llround(0.0); + llroundf(0.0f); + llroundl(0.0l); + #endif + trunc(0.0); + truncf(0.0f); + truncl(0.0l); + // Remainder + remainder(0.0, 0.0); + remainderf(0.0f, 0.0f); + remainderl(0.0l, 0.0l); + remquo(0.0, 0.0, 0); + remquof(0.0f, 0.0f, 0); + remquol(0.0l, 0.0l, 0); + // Manipulation + copysign(0.0, 0.0); + copysignf(0.0f, 0.0f); + copysignl(0.0l, 0.0l); + nan(""); + nanf(""); + nanl(""); + nextafter(0.0, 0.0); + nextafterf(0.0f, 0.0f); + nextafterl(0.0l, 0.0l); + nexttoward(0.0, 0.0); + nexttowardf(0.0f, 0.0f); + nexttowardl(0.0l, 0.0l); + // Max, min, positive difference + fdim(0.0, 0.0); + fdimf(0.0f, 0.0f); + fdiml(0.0l, 0.0l); + fmax(0.0, 0.0); + fmaxf(0.0f, 0.0f); + fmaxl(0.0l, 0.0l); + fmin(0.0, 0.0); + fminf(0.0f, 0.0f); + fminl(0.0l, 0.0l); + // FP Multiply-add + fma(0.0, 0.0, 0.0); + fmaf(0.0f, 0.0f, 0.0f); + fmal(0.0l, 0.0l, 0.0l); + ], + [glibcxx_cv_c99_math_funcs=yes], + [glibcxx_cv_c99_math_funcs=no]) + ]) + if test x"$glibcxx_cv_c99_math_funcs" = x"yes"; then + AC_DEFINE(_GLIBCXX_USE_C99_MATH_FUNCS, 1, + [Define if C99 functions in <math.h> should be imported + in <cmath> in namespace std for C++11.]) + + case "${target_os}" in + darwin*) + AC_CACHE_CHECK([for ISO C99 rounding functions in <math.h>], + glibcxx_cv_c99_math_llround, [ + AC_TRY_COMPILE([#include <math.h>], + [llrint(0.0); + llrintf(0.0f); + llrintl(0.0l); + llround(0.0); + llroundf(0.0f); + llroundl(0.0l); + ], + [glibcxx_cv_c99_math_llround=yes], + [glibcxx_cv_c99_math_llround=no]) + ]) + ;; + esac + if test x"$glibcxx_cv_c99_math_llround" = x"no"; then + AC_DEFINE(_GLIBCXX_NO_C99_ROUNDING_FUNCS, 1, + [Define if C99 llrint and llround functions are missing from <math.h>.]) + fi + fi + # Check for the existence of <complex.h> complex math functions. # This is necessary even though libstdc++ uses the builtin versions # of these functions, because if the builtin cannot be used, a reference @@ -2152,28 +2307,6 @@ AC_DEFUN([GLIBCXX_CHECK_C99_TR1], [ AC_DEFINE(_GLIBCXX_USE_C99_MATH_TR1, 1, [Define if C99 functions or macros in <math.h> should be imported in <tr1/cmath> in namespace std::tr1.]) - - case "${target_os}" in - darwin*) - AC_CACHE_CHECK([for ISO C99 rounding functions in <math.h>], - glibcxx_cv_c99_math_llround, [ - AC_TRY_COMPILE([#include <math.h>], - [llrint(0.0); - llrintf(0.0f); - llrintl(0.0l); - llround(0.0); - llroundf(0.0f); - llroundl(0.0l); - ], - [glibcxx_cv_c99_math_llround=yes], - [glibcxx_cv_c99_math_llround=no]) - ]) - ;; - esac - if test x"$glibcxx_cv_c99_math_llround" = x"no"; then - AC_DEFINE(_GLIBCXX_NO_C99_ROUNDING_FUNCS, 1, - [Define if C99 llrint and llround functions are missing from <math.h>.]) - fi fi # Check for the existence of <inttypes.h> functions (NB: doesn't make |