This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Fix isinf/isnan declaration conflict with C++11
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Mon, 11 Jan 2016 13:45:21 -0200
- Subject: [PATCH] Fix isinf/isnan declaration conflict with C++11
- Authentication-results: sourceware.org; auth=none
GLIBC declares isinf and isnan as expected by Unix98 and for C99 programs
these functions are hidden by the genericis inf and isnan macros.
However C++11 defines isinf and isnan with the same semantics as C99
but requires that they are functions not macros (C++11 26.8 [c.math]
paragraph 10).
This then results in a conflict for perfectly valid C++11 programs:
--
using std::isinf;
using std::isnan;
double d1 = isinf(1.0);
double d2 = isnan(1.0);
d.cc:3:12: error: âconstexpr bool std::isinf(double)â conflicts with a previous declaration
using std::isinf;
[...]
/usr/include/bits/mathcalls.h:201:1: note: previous declaration âint isinf(double)â
__MATHDECL_1 (int,isinf,, (_Mdouble_ __value)) __attribute__ ((__const__));
[...]
--
This patch fixes the prototypes by leaving the obsolete functions
defined for C++98 code (since they do not conflict with any standard
function in C++98), however preventing them on C++11.
No issues found in libstdc++ tests and check on x86_64 and i686 with
glibc testsuite.
[BZ #19439]
* math/bits/mathcalls.h
[!__cplusplus || __cplusplus < 201103L] (isinf): Do not declare
prototype.
[!__cplusplus || __cplusplus < 201103L] (isnan): Likewise.
Patch by Jonathan Wakely <jwakely.gcc@gmail.com>.
---
ChangeLog | 9 +++++++++
math/bits/mathcalls.h | 4 ++++
2 files changed, 13 insertions(+)
diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h
index b82c373..a48345d 100644
--- a/math/bits/mathcalls.h
+++ b/math/bits/mathcalls.h
@@ -196,9 +196,11 @@ __MATHDECL_1 (int,__finite,, (_Mdouble_ __value)) __attribute__ ((__const__));
_Mdouble_END_NAMESPACE
#ifdef __USE_MISC
+# if !defined __cplusplus || __cplusplus < 201103L /* Conflicts with C++11. */
/* 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__));
+# endif
/* Return nonzero if VALUE is finite and not NaN. */
__MATHDECL_1 (int,finite,, (_Mdouble_ __value)) __attribute__ ((__const__));
@@ -230,8 +232,10 @@ __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. */
/* Return nonzero if VALUE is not a number. */
__MATHDECL_1 (int,isnan,, (_Mdouble_ __value)) __attribute__ ((__const__));
+# endif
#endif
#if defined __USE_MISC || (defined __USE_XOPEN && __MATH_DECLARING_DOUBLE)
--
1.9.1