This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later
- From: "Carlos O'Donell" <carlos at redhat dot com>
- To: Jonathan Wakely <jwakely at redhat dot com>, Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- Cc: Jakub Jelinek <jakub at redhat dot com>, libc-alpha at sourceware dot org
- Date: Tue, 9 Feb 2016 16:54:54 -0500
- Subject: Re: [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later
- Authentication-results: sourceware.org; auth=none
- References: <20160201162152 dot GH3017 at tucnak dot redhat dot com> <20160201163400 dot GH3471 at redhat dot com> <56B23119 dot 3050605 at linaro dot org> <20160203174027 dot GK7732 at vapier dot lan> <56B2413D dot 1070309 at linaro dot org> <20160209172356 dot GC8441 at redhat dot com> <56BA240E dot 2080405 at redhat dot com>
On 02/09/2016 12:38 PM, Carlos O'Donell wrote:
> On 02/09/2016 12:23 PM, Jonathan Wakely wrote:
>> On 03/02/16 16:04 -0200, Adhemerval Zanella wrote:
>>>
>>>
>>> On 03-02-2016 15:40, Mike Frysinger wrote:
>>>> On 03 Feb 2016 14:55, Adhemerval Zanella wrote:
>>>>> I will quote the email referenced:
>>>>>
>>>>>> C++11 code using isinf and isnan continues to compile after that
>>>>>> change, because the C++11 standard library provides its own versions
>>>>>> conforming to the C++11 requirements. However, the C++11 library
>>>>>> doesn't provide isinff, isinfl etc. and so code using those
>>>>>> (non-standard) functions will no longer compile if they are not
>>>>>> declared by glibc.
>>>>>
>>>>> This was not clear to me, what kind of build issue are you seeing now?
>>>>> Using isinf{f,l} by including just <cmath> along with C++11? If it is the
>>>>> case please open a bugzilla (or update the original) and please commit
>>>>> the fix.
>>>>
>>>> if the change hasn't seen a release yet, then we can just re-use the
>>>> existing bug since it's really just a direct follow up to that ?
>>>> -mike
>>>>
>>>
>>> I do not see why not.
>>
>> Hi, what's the status of this then - do we need to add a testcase or
>> can it be committed for 2.23? (or wait for 2.24?)
>
> Yes, we want always want a test case. It's perfectly fine to use C++
> in tests in glibc, and if the C++ compiler isn't present those tests
> should become UNSUPPORTED tests, which is OK (when bootstrapping).
>
> In summary:
> - Add C++ test.
> - Use BZ #19439 and provide ChangeLog.
> - Post v2
v2
- Added test case which fails to compile before patch. I saw no easier
way to test a header inclusion issue like this than to fail the entire
testsuite when building that test. Adding a conform test just for this
is overkill and outside the scope of conformtest.
- Regression tested on x86_64 with no regressions.
I'll commit this ASAP if nobody objects.
Adhemerval?
2016-02-09 Jakub Jelinek <jakub@redhat.com>
Jonathan Wakely <jwakely@redhat.com>
Carlos O'Donell <carlos@redhat.com>
[BZ 19439]
* math/Makefile (tests): Add test-math-isinff.
(CFLAGS-test-math-isinff.cc): Use -std=gnu++11.
* math/bits/mathcalls.h [__USE_MISC]: Use
'|| __MATH_DECLARING_DOUBLE == 0' to relax definition of
functions not in C++11 and which don't conflict e.g. isinff,
isinfl etc.
* math/test-math-isinff.cc: New file.
diff --git a/math/Makefile b/math/Makefile
index 222ee6b..7d573a0 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -114,6 +114,7 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
test-nearbyint-except-2 test-signgam-uchar test-signgam-uchar-init \
test-signgam-uint test-signgam-uint-init test-signgam-ullong \
test-signgam-ullong-init test-nan-overflow test-nan-payload \
+ test-math-isinff \
$(tests-static)
tests-static = test-fpucw-static test-fpucw-ieee-static \
test-signgam-uchar-static test-signgam-uchar-init-static \
@@ -220,6 +221,8 @@ CFLAGS-test-signgam-ullong-init.c = -std=c99
CFLAGS-test-signgam-ullong-static.c = -std=c99
CFLAGS-test-signgam-ullong-init-static.c = -std=c99
+CFLAGS-test-math-isinff.cc = -std=gnu++11
+
# The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
# for error handling in the -lm functions.
install-lib += libieee.a
diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h
index a48345d..9a7b3f0 100644
--- a/math/bits/mathcalls.h
+++ b/math/bits/mathcalls.h
@@ -196,7 +196,9 @@ __MATHDECL_1 (int,__finite,, (_Mdouble_ __value)) __attribute__ ((__const__));
_Mdouble_END_NAMESPACE
#ifdef __USE_MISC
-# if !defined __cplusplus || __cplusplus < 201103L /* Conflicts with C++11. */
+# if (!defined __cplusplus \
+ || __cplusplus < 201103L /* isinf conflicts with C++11. */ \
+ || __MATH_DECLARING_DOUBLE == 0) /* isinff or isinfl don't. */
/* Return 0 if VALUE is finite or NaN, +1 if it
is +Infinity, -1 if it is -Infinity. */
__MATHDECL_1 (int,isinf,, (_Mdouble_ __value)) __attribute__ ((__const__));
@@ -232,7 +234,9 @@ __END_NAMESPACE_C99
__MATHDECL_1 (int,__isnan,, (_Mdouble_ __value)) __attribute__ ((__const__));
#if defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K)
-# if !defined __cplusplus || __cplusplus < 201103L /* Conflicts with C++11. */
+# if (!defined __cplusplus \
+ || __cplusplus < 201103L /* isnan conflicts with C++11. */ \
+ || __MATH_DECLARING_DOUBLE == 0) /* isnanf or isnanl don't. */
/* Return nonzero if VALUE is not a number. */
__MATHDECL_1 (int,isnan,, (_Mdouble_ __value)) __attribute__ ((__const__));
# endif
diff --git a/math/test-math-isinff.cc b/math/test-math-isinff.cc
new file mode 100644
index 0000000..195d753
--- /dev/null
+++ b/math/test-math-isinff.cc
@@ -0,0 +1,48 @@
+/* Test for bug 19439.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#define _GNU_SOURCE 1
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static int
+do_test (void)
+{
+ /* Verify that isinff, isinfl, isnanf, and isnanlf are defined
+ in the header under C++11 and can be called. Without the
+ header fix this test will not compile. */
+ if (isinff (1.0f)
+ || !isinff (INFINITY)
+ || isinfl (1.0L)
+ || !isinfl (INFINITY)
+ || isnanf (2.0f)
+ || !isnanf (NAN)
+ || isnanl (2.0L)
+ || !isnanl (NAN))
+ {
+ printf ("FAIL: Failed to call is* functions.\n");
+ exit (1);
+ }
+ printf ("PASS: Able to call isinff, isinfl, isnanf, and isnanl.\n");
+ exit (0);
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
---
Cheers,
Carlos.
- References:
- [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later
- Re: [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later
- Re: [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later
- Re: [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later
- Re: [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later
- Re: [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later
- Re: [PATCH] Preserve ::is{inf,nan}{f,l} prototypes even for C++11 and later