On 20/01/16 17:17 +0100, Dominik Vogt wrote:
On Tue, Jan 19, 2016 at 09:43:59PM +0000, Jonathan Wakely wrote:
On 08/01/16 19:18 +0000, Jonathan Wakely wrote:
>This resolves the longstanding issue that #include <math.h> uses the C
>library header, which on most targets doesn't declare the additional
>overloads required by C++11 26.8 [c.math], and similarly for
><stdlib.h>.
>
>With this patch libstdc++ provides its own <math.h> and <stdlib.h>
>wrappers, which are equivalent to <cmath> or <cstdlib> followed by
>using-directives for all standard names. This means there are no more
>inconsistencies in the contents of the <cxxx> and <xxx.h> headers.
Tested x86_64-linux, powerpc64le-linux, powerpc-aix,
x86_64-freebsd10.2, x86_64-dragonfly4.2
Committed to trunk.
I think this fix is incomplete. There are still some test errors
because of missing signatures in the Plumhall testsuite. Please
check the information I've added to
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60401
This should fix it, tested powerpc64le-linux and committed to trunk.
commit a2d2a215d6ce58e9a2d6d9b5c3cded3c06b7cf8e
Author: Jonathan Wakely <jwak...@redhat.com>
Date: Wed Jan 20 16:47:57 2016 +0000
Add C++11 <cmath> overloads to the global namespace
PR libstdc++/60401
* include/c_compatibility/math.h (acosh, asinh, atanh, acbrt,
copysign, erf, erfc, exp2, expm1, fdim, fma, fmax, fmin, hypot, ilogb,
lgamma, llrint, llround, log1p, log2, logb, lrint, lround, nearbyint,
nextafter, nexttoward, remainder, remquo, rint, round, scalbln, scalbn,
tgamma, trunc) [__cplusplus >= 201103L && _GLIBCXX_USE_C99_MATH_TR1]:
Add using declarations.
* testsuite/26_numerics/headers/cmath/60401.cc: New.
diff --git a/libstdc++-v3/include/c_compatibility/math.h b/libstdc++-v3/include/c_compatibility/math.h
index 67f5ef1..d1fe75d 100644
--- a/libstdc++-v3/include/c_compatibility/math.h
+++ b/libstdc++-v3/include/c_compatibility/math.h
@@ -74,5 +74,42 @@ using std::islessgreater;
using std::isunordered;
#endif
+#if __cplusplus >= 201103L && defined(_GLIBCXX_USE_C99_MATH_TR1)
+using std::acosh;
+using std::asinh;
+using std::atanh;
+using std::cbrt;
+using std::copysign;
+using std::erf;
+using std::erfc;
+using std::exp2;
+using std::expm1;
+using std::fdim;
+using std::fma;
+using std::fmax;
+using std::fmin;
+using std::hypot;
+using std::ilogb;
+using std::lgamma;
+using std::llrint;
+using std::llround;
+using std::log1p;
+using std::log2;
+using std::logb;
+using std::lrint;
+using std::lround;
+using std::nearbyint;
+using std::nextafter;
+using std::nexttoward;
+using std::remainder;
+using std::remquo;
+using std::rint;
+using std::round;
+using std::scalbln;
+using std::scalbn;
+using std::tgamma;
+using std::trunc;
+#endif // C++11 && _GLIBCXX_USE_C99_MATH_TR1
+
#endif
#endif
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cmath/60401.cc b/libstdc++-v3/testsuite/26_numerics/headers/cmath/60401.cc
new file mode 100644
index 0000000..a6be94a
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/headers/cmath/60401.cc
@@ -0,0 +1,68 @@
+// 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++11" }
+// { dg-do compile }
+
+// PR libstdc++/60401
+
+#include <math.h>
+
+namespace test
+{
+ template<typename T>
+ using F = T*;
+
+ F<float(float)>abs = ::abs;
+
+#ifdef _GLIBCXX_USE_C99_MATH_TR1
+ F<float(float)> acosh = ::acosh;
+ F<float(float)> asinh = ::asinh;
+ F<float(float)> atanh = ::atanh;
+ F<float(float)> cbrt = ::cbrt;
+ F<float(float, float)> copysign = ::copysign;
+ F<float(float)> erf = ::erf;
+ F<float(float)> erfc = ::erfc;
+ F<float(float)> exp2 = ::exp2;
+ F<float(float)> expm1 = ::expm1;
+ F<float(float, float)> fdim = ::fdim;
+ F<float(float, float, float)> fma = ::fma;
+ F<float(float, float)> fmax = ::fmax;
+ F<float(float, float)> fmin = ::fmin;
+ F<float(float, float)> hypot = ::hypot;
+ F<int(float)> ilogb = ::ilogb;
+ F<float(float)> lgamma = ::lgamma;
+ F<long long(float)> llrint = ::llrint;
+ F<long long(float)> llround = ::llround;
+ F<float(float)> log1p = ::log1p;
+ F<float(float)> log2 = ::log2;
+ F<float(float)> logb = ::logb;
+ F<long(float)> lrint = ::lrint;
+ F<long(float)> lround = ::lround;
+ F<float(float)> nearbyint = ::nearbyint;
+ F<float(float, float)> nextafter = ::nextafter;
+ F<float(float, long double)> nexttoward = ::nexttoward;
+ F<float(float, float)> remainder = ::remainder;
+ F<float(float, float, int*)> remquo = ::remquo;
+ F<float(float)> rint = ::rint;
+ F<float(float)> round = ::round;
+ F<float(float, long)> scalbln = ::scalbln;
+ F<float(float, int)> scalbn = ::scalbn;
+ F<float(float)> tgamma = ::tgamma;
+ F<float(float)> trunc = ::trunc;
+#endif
+}