diff --git a/include/boost/core/fclose_deleter.hpp b/include/boost/core/fclose_deleter.hpp index 7a0d34a..8f7a7fd 100644 --- a/include/boost/core/fclose_deleter.hpp +++ b/include/boost/core/fclose_deleter.hpp @@ -36,7 +36,8 @@ struct fclose_deleter */ void operator() (std::FILE* p) const BOOST_NOEXCEPT { - std::fclose(p); + if (BOOST_LIKELY(!!p)) + std::fclose(p); } }; diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index a601332..a08c937 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -176,7 +176,7 @@ run demangle_test.cpp run demangled_name_test.cpp : : : always_show_run_output ; -run demangled_name_test.cpp : : : off always_show_run_output : demangled_name_test_no_rtti ; +run demangled_name_test.cpp : : : off always_show_run_output : demangled_name_test_no_rtti ; run scoped_enum.cpp ; compile-fail scoped_enum_compile_fail_conv_from_int.cpp @@ -186,8 +186,8 @@ compile-fail scoped_enum_compile_fail_conv_to_int.cpp run underlying_type.cpp ; -compile fclose_deleter_test.cpp - : windows:_CRT_SECURE_NO_WARNINGS windows:_CRT_SECURE_NO_DEPRECATE ; +run fclose_deleter_test.cpp + : : : windows:_CRT_SECURE_NO_WARNINGS windows:_CRT_SECURE_NO_DEPRECATE ; run pointer_traits_pointer_test.cpp ; run pointer_traits_element_type_test.cpp ; diff --git a/test/fclose_deleter_test.cpp b/test/fclose_deleter_test.cpp index dbe85a5..4363335 100644 --- a/test/fclose_deleter_test.cpp +++ b/test/fclose_deleter_test.cpp @@ -16,17 +16,29 @@ #include #include #include +#include +#include #if !defined(BOOST_NO_CXX11_SMART_PTR) #include #endif +boost::movelib::unique_ptr< std::FILE, boost::fclose_deleter > make_boost_unique_file(const char* filename) +{ + return boost::movelib::unique_ptr< std::FILE, boost::fclose_deleter >(std::fopen(filename, "w")); +} + +boost::shared_ptr< std::FILE > make_boost_shared_file(const char* filename) +{ + return boost::shared_ptr< std::FILE >(std::fopen(filename, "w"), boost::fclose_deleter()); +} + #if !defined(BOOST_NO_CXX11_SMART_PTR) -std::unique_ptr< std::FILE, boost::fclose_deleter > make_unique_file(const char* filename) +std::unique_ptr< std::FILE, boost::fclose_deleter > make_std_unique_file(const char* filename) { return std::unique_ptr< std::FILE, boost::fclose_deleter >(std::fopen(filename, "w")); } -std::shared_ptr< std::FILE > make_shared_file(const char* filename) +std::shared_ptr< std::FILE > make_std_shared_file(const char* filename) { return std::shared_ptr< std::FILE >(std::fopen(filename, "w"), boost::fclose_deleter()); } @@ -43,9 +55,18 @@ int main() file = NULL; } + make_boost_unique_file(filename); + make_boost_shared_file(filename); + #if !defined(BOOST_NO_CXX11_SMART_PTR) - make_unique_file(filename); - make_shared_file(filename); + make_std_unique_file(filename); + make_std_shared_file(filename); +#endif + + // Test if the deleter can be called on a NULL pointer + boost::shared_ptr< std::FILE >(static_cast< std::FILE* >(NULL), boost::fclose_deleter()); +#if !defined(BOOST_NO_CXX11_SMART_PTR) + std::shared_ptr< std::FILE >(static_cast< std::FILE* >(NULL), boost::fclose_deleter()); #endif std::remove(filename);