Add C++-conforming wrappers for stdlib.h and math.h

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
This commit is contained in:
Jonathan Wakely 2016-01-19 21:43:55 +00:00 committed by Jonathan Wakely
parent af33ba0d93
commit 96e19adabc
10 changed files with 124 additions and 17 deletions

View 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.

View 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

View 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 = \

View File

@ -26,12 +26,15 @@
* 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

View File

@ -26,25 +26,37 @@
* 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

View 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

View 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

View File

@ -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>");

View File

@ -17,12 +17,10 @@
// 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() { }

View File

@ -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>");