Make bits/math-finite.h conditions match other headers (bug 19205).
commit3bfee8beb8caa939020d942dfa405a3d98975749
authorJoseph Myers <joseph@codesourcery.com>
Thu, 5 Nov 2015 00:48:57 +0000 (5 00:48 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 5 Nov 2015 00:48:57 +0000 (5 00:48 +0000)
treef62482f0febbd4a944cd60b8d96c4be378d29789
parent9f9f27248bf464b465fd4f05112a5b479503e83a
Make bits/math-finite.h conditions match other headers (bug 19205).

bits/math-finite.h declares -ffinite-math-only variants of various
functions under conditions not matching those under which the normal
versions are declared.

* math.h only ever includes bits/mathcalls.h to declare float and long
  double functions if __USE_ISOC99, but bits/math-finite.h declares
  some float functions regardless (long double ones are conditioned on
  __MATH_DECLARE_LDOUBLE).  (For C90 functions this isn't a
  conformance bug because C90 reserves the float and long double
  names, but is still contrary to good glibc practice.  For some other
  functions in older XSI standards it *is* a conformance bug.)

* Some functions are defined as inlines using lgamma_r functions under
  conditions where those lgamma_r functions are not themselves
  declared.

* hypot is declared under __USE_XOPEN || __USE_ISOC99 in
  bits/mathcalls.h, __USE_ISOC99 only in bits/math-finite.h.

* float and long double versions of Bessel functions should be limited
  to __USE_MISC (as in bug 18977).

* gamma should not be declared for __USE_XOPEN2K (as in bug 18967).

* remainder should be restricted to __USE_XOPEN_EXTENDED ||
  __USE_ISOC99, not unconditional.

* scalb should not be declared for __USE_XOPEN2K8, and scalbf and
  scalbl are non-POSIX (as in bug 18967).

This patch fixes all these issues (it doesn't seem worth splitting
them into separate patches or bugs).  I put __USE_ISOC99 conditionals,
where needed, around both float and long double declarations, even
though formally redundant around the long double declarations because
__MATH_DECLARE_LDOUBLE isn't defined without __USE_ISOC99; it seemed
clearer that way.  The missing declarations of lgamma_r functions are
dealt with by directly using declarations of __lgamma*_r_finite, in
the implementation namespace, rather than having the inlines rely on
asm redirection of lgamma*_r.

After this patch, there are some apparently redundant nested
__USE_ISOC99 conditionals in lgamma / gamma definitions.  These
actually reflect a separate bug (the correct condition for the lgamma
inline functions to set signgam is __USE_MISC || __USE_XOPEN, the
condition under which signgam is declared, rather than disabling
setting it if __USE_ISOC99, which includes XSI POSIX versions for
which signgam *should* be set).  They'll be fixed as part of a fix for
that bug, which will also add tests for these inlines.  I've put a
note about more general conform/ test coverage for -ffinite-math-only
on
<https://sourceware.org/glibc/wiki/Development_Todo/Master#conformtest_improvements>,
alongside other options for which this is also relevant (some of which
have also had such bugs in the past relating to mismatched
conditionals).

I also intend to enable the main libm-test.inc tests for the
math-finite.h functions, but some other bugs in __*_finite need fixing
first.

[BZ #19205]
* math/bits/math-finite.h (acosf): Condition declaration on
[__USE_ISOC99].
(acosl): Likewise.
(acoshf): Likewise.
(acoshl): Likewise.
(asinf): Likewise.
(asinl): Likewise.
(atan2f): Likewise.
(atan2l): Likewise.
(atanhf): Likewise.
(atanhl): Likewise.
(coshf): Likewise.
(coshl): Likewise.
(expf): Likewise.
(expl): Likewise.
(fmodf): Likewise.
(fmodl): Likewise.
(hypot): Change condition to [__USE_XOPEN || __USE_ISOC99].
(j0f): Change condition to [__USE_MISC && __USE_ISOC99].
(j0l): Likewise.
(y0f): Likewise.
(y0l): Likewise.
(j1f): Likewise.
(j1l): Likewise.
(y1f): Likewise.
(y1l): Likewise.
(jnf): Likewise.
(jnl): Likewise.
(ynf): Likewise.
(ynl): Likewise.
(lgammaf_r): Condition declaration on [__USE_ISOC99].
(lgammal_r): Likewise.
(__lgamma_r_finite): New declaration.
(__lgammaf_r_finite): Likewise.
(__lgammal_r_finite): Likewise.
(lgamma): Use __lgamma_r_finite.
(lgammaf): Condition definition on [__USE_ISOC99].  Use
__lgammaf_r_finite.
(lgammal): Condition definition on [__USE_ISOC99].  Use
__lgammal_r_finite.
(gamma): Do not define for [!__USE_MISC && __USE_XOPEN2K].  Use
__lgamma_r_finite.
(gammaf): Condition definition on [__USE_ISOC99].  Use
__lgammaf_r_finite.
(gammal): Condition definition on [__USE_ISOC99].  Use
__lgammal_r_finite.
(logf): Condition declaration on [__USE_ISOC99].
(logl): Likewise.
(log10f): Likewise.
(log10l): Likewise.
(ldexpf): Likewise.
(ldexpl): Likewise.
(powf): Likewise.
(powl): Likewise.
(remainder): Condition declaration on [__USE_XOPEN_EXTENDED ||
__USE_ISOC99].
(remainderf): Condition declaration on [__USE_ISOC99].
(remainderl): Likewise.
(scalb): Do not declare for [!__USE_MISC && __USE_XOPEN2K8].
(scalbf): Change condition to [__USE_MISC && __USE_ISOC99].
(scalbl): Likewise.
(sinhf): Condition declaration on [__USE_ISOC99].
(sinhl): Likewise.
(sqrtf): Likewise.
(sqrtl): Likewise.
ChangeLog
NEWS
math/bits/math-finite.h