]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add C++-conforming wrappers for stdlib.h and math.h
authorJonathan Wakely <jwakely@redhat.com>
Tue, 19 Jan 2016 21:43:55 +0000 (21:43 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 19 Jan 2016 21:43:55 +0000 (21:43 +0000)
PR libstdc++/14608
PR libstdc++/60401
* include/Makefile.am: Use c_compatibility math.h and stdlib.h for
--enable-cheaders=c_global configs.
* include/Makefile.in: Regenerate.
* include/c_compatibility/math.h: Remove obsolete _GLIBCXX_NAMESPACE_C
test and allow inclusion from C files.
* include/c_compatibility/stdlib.h: Likewise. Support freestanding.
(at_quick_exit, quick_exit): Add using directives.
* include/c_global/cmath: Use #include_next for math.h.
* include/c_global/cstdlib: Use #include_next for stdlib.h.
* testsuite/26_numerics/headers/cmath/14608.cc: New.
* testsuite/26_numerics/headers/cmath/c99_classification_macros_c.cc:
Remove xfail for most targets.
* testsuite/26_numerics/headers/cstdlib/60401.cc: New.

From-SVN: r232586

libstdc++-v3/ChangeLog
libstdc++-v3/include/Makefile.am
libstdc++-v3/include/Makefile.in
libstdc++-v3/include/c_compatibility/math.h
libstdc++-v3/include/c_compatibility/stdlib.h
libstdc++-v3/include/c_global/cmath
libstdc++-v3/include/c_global/cstdlib
libstdc++-v3/testsuite/26_numerics/headers/cmath/14608.cc [new file with mode: 0644]
libstdc++-v3/testsuite/26_numerics/headers/cmath/c99_classification_macros_c.cc
libstdc++-v3/testsuite/26_numerics/headers/cstdlib/60401.cc [new file with mode: 0644]

index d68f5a529cda51886fa29ee8c70544715e5b9cb9..4bf6e259e586963ea02e3a66d5bf6a215a8fddd2 100644 (file)
@@ -1,3 +1,21 @@
+2016-01-19  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/14608
+       PR libstdc++/60401
+       * include/Makefile.am: Use c_compatibility math.h and stdlib.h for
+       --enable-cheaders=c_global configs.
+       * include/Makefile.in: Regenerate.
+       * include/c_compatibility/math.h: Remove obsolete _GLIBCXX_NAMESPACE_C
+       test and allow inclusion from C files.
+       * include/c_compatibility/stdlib.h: Likewise. Support freestanding.
+       (at_quick_exit, quick_exit): Add using directives.
+       * include/c_global/cmath: Use #include_next for math.h.
+       * include/c_global/cstdlib: Use #include_next for stdlib.h.
+       * testsuite/26_numerics/headers/cmath/14608.cc: New.
+       * testsuite/26_numerics/headers/cmath/c99_classification_macros_c.cc:
+       Remove xfail for most targets.
+       * testsuite/26_numerics/headers/cstdlib/60401.cc: New.
+
 2016-01-18  Torvald Riegel  <triegel@redhat.com>
 
        * include/bits/c++config (_GLIBCXX_USE_WEAK_REF): New.
index 39327d98b27b015bdfd2c3dad5db80481d8ad728..573f057a120b5a0817a58377154e7a73886df87e 100644 (file)
@@ -740,7 +740,9 @@ if GLIBCXX_C_HEADERS_C_GLOBAL
 c_compatibility_headers = \
        ${c_compatibility_srcdir}/complex.h \
        ${c_compatibility_srcdir}/fenv.h \
-       ${c_compatibility_srcdir}/tgmath.h
+       ${c_compatibility_srcdir}/tgmath.h \
+       ${c_compatibility_srcdir}/math.h \
+       ${c_compatibility_srcdir}/stdlib.h
 endif
 
 if GLIBCXX_C_HEADERS_C
index e74fae8b849c49c72ccafd3eb2f0b79a892dad52..57f1ec561b9fa8f69b4d5cb71562fc46ace9ed7d 100644 (file)
@@ -1023,7 +1023,9 @@ c_compatibility_builddir = .
 @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@c_compatibility_headers = \
 @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@      ${c_compatibility_srcdir}/complex.h \
 @GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@      ${c_compatibility_srcdir}/fenv.h \
-@GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@      ${c_compatibility_srcdir}/tgmath.h
+@GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@      ${c_compatibility_srcdir}/tgmath.h \
+@GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@      ${c_compatibility_srcdir}/math.h \
+@GLIBCXX_C_HEADERS_C_GLOBAL_TRUE@      ${c_compatibility_srcdir}/stdlib.h
 
 @GLIBCXX_C_HEADERS_C_STD_TRUE@c_compatibility_headers = 
 @GLIBCXX_C_HEADERS_C_TRUE@c_compatibility_headers = \
index 7617a316a60c6639a15cb92379bd1def9353e176..67f5ef1afa1d1194b92e134f07d4ade74808a65c 100644 (file)
  *  This is a Standard C++ Library header.
  */
 
-#include <cmath>
 
 #ifndef _GLIBCXX_MATH_H
 #define _GLIBCXX_MATH_H 1
 
-#ifdef _GLIBCXX_NAMESPACE_C
+#if !defined __cplusplus || defined _GLIBCXX_INCLUDE_NEXT_C_HEADERS
+# include_next <math.h>
+#else
+# include <cmath>
+
 using std::abs;
 using std::acos;
 using std::asin;
@@ -72,5 +75,4 @@ using std::isunordered;
 #endif
 
 #endif
-
 #endif
index bd666d653502b94acfa55d65b1ed50f997f65851..bd72580cffef084f621ef039b54cb62eb2b910dd 100644 (file)
  *  This is a Standard C++ Library header.
  */
 
-#include <cstdlib>
-
 #ifndef _GLIBCXX_STDLIB_H
 #define _GLIBCXX_STDLIB_H 1
 
-#ifdef _GLIBCXX_NAMESPACE_C
+#if !defined __cplusplus || defined _GLIBCXX_INCLUDE_NEXT_C_HEADERS
+# include_next <stdlib.h>
+#else
+# include <cstdlib>
+
+using std::abort;
+using std::atexit;
+using std::exit;
+#if __cplusplus >= 201103L
+# ifdef _GLIBCXX_HAVE_AT_QUICK_EXIT
+  using std::at_quick_exit;
+# endif
+# ifdef _GLIBCXX_HAVE_QUICK_EXIT
+  using std::quick_exit;
+# endif
+#endif
+
+#if _GLIBCXX_HOSTED
 using std::div_t;
 using std::ldiv_t;
 
-using std::abort;
 using std::abs;
-using std::atexit;
 using std::atof;
 using std::atoi;
 using std::atol;
 using std::bsearch;
 using std::calloc;
 using std::div;
-using std::exit;
 using std::free;
 using std::getenv;
 using std::labs;
@@ -66,3 +78,4 @@ using std::wctomb;
 #endif
 
 #endif
+#endif
index c689b31e5afa18a5cdb42cdd55637159efe1509a..45e40ab3dc16ed8be00439002c100ed3f20d1342 100644 (file)
@@ -41,7 +41,9 @@
 #include <bits/c++config.h>
 #include <bits/cpp_type_traits.h>
 #include <ext/type_traits.h>
-#include <math.h>
+#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
+#include_next <math.h>
+#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
 
 #ifndef _GLIBCXX_CMATH
 #define _GLIBCXX_CMATH 1
index 0f506a4e365c9b0afe62a58d4d56c6e296e6c995..44b6e5c709c0696bc844617483b230b4ae905b23 100644 (file)
@@ -69,7 +69,11 @@ namespace std
 
 #else
 
-#include <stdlib.h>
+// Need to ensure this finds the C library's <stdlib.h> not a libstdc++
+// wrapper that might already be installed later in the include search path.
+#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
+#include_next <stdlib.h>
+#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
 
 // Get rid of those macros defined in <stdlib.h> in lieu of real functions.
 #undef abort
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cmath/14608.cc b/libstdc++-v3/testsuite/26_numerics/headers/cmath/14608.cc
new file mode 100644 (file)
index 0000000..65f5c6c
--- /dev/null
@@ -0,0 +1,38 @@
+// 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 }
+
+#include <cmath>
+// Also make names from <cmath> available in the global namespace:
+#include <math.h>
+
+bool foo(double d)
+{
+  return ::isfinite(d); // PR libstdc++/14608
+}
+
+int bar(double d)
+{
+  return ::signbit(d); // PR libstdc++/44611
+}
+
+constexpr bool is_double(double) { return true; }
+template<typename T> constexpr bool is_double(T) { return false; }
+using type = decltype(::abs(1.5));
+static_assert(is_double(type{}), "::abs(double) overload exists in <math.h>");
index ead3018756ccecf14c546261f9e1c20a1dca71ec..cbced7dece224b054c015a2c5cc35179afcd8594 100644 (file)
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-do compile }
+// { dg-do compile { xfail uclibc } }
+// { dg-excess-errors "" { target uclibc } }
 // { dg-add-options no_pch }
 
-// { dg-xfail-if "" { { *-*-linux* *-*-gnu* *-*-darwin* *-*-solaris2.1[01]* hppa*-*-hpux* *-*-mingw* *-*-aix* } || { uclibc || newlib } } { "*" } { "" } }
-// { dg-excess-errors "" { target { { *-*-linux* *-*-gnu* *-*-darwin* *-*-solaris2.1[01]* hppa*-*-hpux* *-*-mingw* *-*-aix* } || { uclibc || newlib } } } }
-
 #include <math.h>
 
 void fpclassify() { }
diff --git a/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/60401.cc b/libstdc++-v3/testsuite/26_numerics/headers/cstdlib/60401.cc
new file mode 100644 (file)
index 0000000..f0cff33
--- /dev/null
@@ -0,0 +1,28 @@
+// 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 <stdlib.h>
+
+constexpr bool is_long(long) { return true; }
+template<typename T> constexpr bool is_long(T) { return false; }
+using type = decltype(::abs(1L));
+static_assert(is_long(type{}), "::abs(long) overload exists in <stdlib.h>");