diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c17ca807fac..c09e8561e66 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2013-10-03 Marc Glisse + + * libsupc++/del_op.cc (operator delete): Don't test for 0 before free. + * libsupc++/del_opnt.cc (free): Only declare if freestanding. + (operator delete): Qualify free with std::. + 2013-10-02 Jonathan Wakely Daniel Krugler diff --git a/libstdc++-v3/libsupc++/del_op.cc b/libstdc++-v3/libsupc++/del_op.cc index 2d860e18622..ee446c36f14 100644 --- a/libstdc++-v3/libsupc++/del_op.cc +++ b/libstdc++-v3/libsupc++/del_op.cc @@ -43,6 +43,5 @@ _GLIBCXX_END_NAMESPACE_VERSION _GLIBCXX_WEAK_DEFINITION void operator delete(void* ptr) _GLIBCXX_USE_NOEXCEPT { - if (ptr) - std::free(ptr); + std::free(ptr); } diff --git a/libstdc++-v3/libsupc++/del_opnt.cc b/libstdc++-v3/libsupc++/del_opnt.cc index bb37191caed..a04ea401b1c 100644 --- a/libstdc++-v3/libsupc++/del_opnt.cc +++ b/libstdc++-v3/libsupc++/del_opnt.cc @@ -24,12 +24,24 @@ // . #include -#include "new" -extern "C" void free (void *); +#if !_GLIBCXX_HOSTED +// A freestanding C runtime may not provide "free" -- but there is no +// other reasonable way to implement "operator delete". +namespace std +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + extern "C" void free(void*); +_GLIBCXX_END_NAMESPACE_VERSION +} // namespace +#else +# include +#endif + +#include "new" _GLIBCXX_WEAK_DEFINITION void operator delete (void *ptr, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT { - free (ptr); + std::free(ptr); }