diff --git a/include/boost/archive/basic_streambuf_locale_saver.hpp b/include/boost/archive/basic_streambuf_locale_saver.hpp index 88c96f00..6efc706a 100644 --- a/include/boost/archive/basic_streambuf_locale_saver.hpp +++ b/include/boost/archive/basic_streambuf_locale_saver.hpp @@ -69,7 +69,11 @@ public: m_locale(s.getloc()) {} ~basic_ios_locale_saver(){ + // libc++ doesn't support std::[w]ostream.sync() + // but gcc will throw an error if sync() isn't invoked + #ifndef _LIBCPP_VERSION m_ios.sync(); + #endif m_ios.imbue(m_locale); } private: diff --git a/include/boost/archive/impl/basic_text_iprimitive.ipp b/include/boost/archive/impl/basic_text_iprimitive.ipp index 8e3fbbfe..d7f72eb5 100644 --- a/include/boost/archive/impl/basic_text_iprimitive.ipp +++ b/include/boost/archive/impl/basic_text_iprimitive.ipp @@ -119,9 +119,10 @@ basic_text_iprimitive::basic_text_iprimitive( locale_saver(is) { if(! no_codecvt){ - is.imbue(archive_locale); + is_.sync(); + is_.imbue(archive_locale); } - is >> std::noboolalpha; + is_ >> std::noboolalpha; } #else {} diff --git a/include/boost/archive/impl/basic_text_oprimitive.ipp b/include/boost/archive/impl/basic_text_oprimitive.ipp index 62bbc72c..5e3e203c 100644 --- a/include/boost/archive/impl/basic_text_oprimitive.ipp +++ b/include/boost/archive/impl/basic_text_oprimitive.ipp @@ -93,9 +93,14 @@ basic_text_oprimitive::basic_text_oprimitive( locale_saver(os) { if(! no_codecvt){ - os.imbue(archive_locale); + // libc++ doesn't support std::wostream.sync() + // but gcc will throw an error if sync() isn't invoked + #ifndef _LIBCPP_VERSION + os_.sync(); + #endif + os_.imbue(archive_locale); } - os << std::noboolalpha; + os_ << std::noboolalpha; } #else {} diff --git a/include/boost/archive/impl/xml_wiarchive_impl.ipp b/include/boost/archive/impl/xml_wiarchive_impl.ipp index c99df6a6..30314e1a 100644 --- a/include/boost/archive/impl/xml_wiarchive_impl.ipp +++ b/include/boost/archive/impl/xml_wiarchive_impl.ipp @@ -163,8 +163,8 @@ xml_wiarchive_impl::xml_wiarchive_impl( is_.getloc(), new boost::archive::detail::utf8_codecvt_facet ); - is.sync(); - is.imbue(l); + is_.sync(); + is_.imbue(l); } if(0 == (flags & no_header)) init(); diff --git a/include/boost/archive/impl/xml_woarchive_impl.ipp b/include/boost/archive/impl/xml_woarchive_impl.ipp index 67dc1181..6fd5d7b2 100644 --- a/include/boost/archive/impl/xml_woarchive_impl.ipp +++ b/include/boost/archive/impl/xml_woarchive_impl.ipp @@ -125,8 +125,12 @@ xml_woarchive_impl::xml_woarchive_impl( os_.getloc(), new boost::archive::detail::utf8_codecvt_facet ); - os.sync(); - os.imbue(l); + // libc++ doesn't support std::[w]ostream.sync() + // but gcc will throw an error if sync() isn't invoked + #ifndef _LIBCPP_VERSION + os_.sync(); + #endif + os_.imbue(l); } if(0 == (flags & no_header)) this->init();