Index: libcxx/include/ios =================================================================== --- libcxx/include/ios +++ libcxx/include/ios @@ -607,8 +607,15 @@ static_assert((is_same<_CharT, typename traits_type::char_type>::value), "traits_type::char_type must be the same type as CharT"); +#ifdef _LIBCPP_CXX03_LANG + // Preserve the ability to compare with literal 0, + // and implicitly convert to bool, but not implicitly convert to int. + _LIBCPP_INLINE_VISIBILITY + operator const void*() const {return fail() ? nullptr : this;} +#else _LIBCPP_INLINE_VISIBILITY explicit operator bool() const {return !fail();} +#endif _LIBCPP_INLINE_VISIBILITY bool operator!() const {return fail();} _LIBCPP_INLINE_VISIBILITY iostate rdstate() const {return ios_base::rdstate();} Index: libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp =================================================================== --- libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp +++ libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp @@ -27,7 +27,12 @@ static_assert((!std::is_convertible::value), ""); static_assert((!std::is_convertible::value), ""); static_assert((!std::is_convertible::value), ""); - static_assert((!std::is_convertible::value), ""); +#if TEST_STD_VER >= 11 + static_assert(!std::is_convertible::value, ""); +#else + static_assert(std::is_convertible::value, ""); + (void)(ios == 0); // SPEC2006 apparently relies on this to compile +#endif return 0; }