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:
parent
af33ba0d93
commit
96e19adabc
10 changed files with 124 additions and 17 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
38
libstdc++-v3/testsuite/26_numerics/headers/cmath/14608.cc
Normal file
38
libstdc++-v3/testsuite/26_numerics/headers/cmath/14608.cc
Normal 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>");
|
|
@ -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() { }
|
||||
|
|
28
libstdc++-v3/testsuite/26_numerics/headers/cstdlib/60401.cc
Normal file
28
libstdc++-v3/testsuite/26_numerics/headers/cstdlib/60401.cc
Normal 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>");
|
Loading…
Add table
Reference in a new issue