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
+}

Reply via email to