summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/ios17
-rw-r--r--libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp7
2 files changed, 22 insertions, 2 deletions
diff --git a/libcxx/include/ios b/libcxx/include/ios
index cbea478a74a..dfeb1f62eed 100644
--- a/libcxx/include/ios
+++ b/libcxx/include/ios
@@ -585,9 +585,22 @@ public:
typedef typename traits_type::pos_type pos_type;
typedef typename traits_type::off_type off_type;
+#if defined(_LIBCPP_CXX03_LANG)
+private:
+ struct __bool_tag {};
+ typedef void (basic_ios::*_BoolType)(__bool_tag) const;
+ void __true_value(__bool_tag) const {}
+
+public:
+ _LIBCPP_ALWAYS_INLINE
+ operator _BoolType() const {
+ return !fail() ? &basic_ios::__true_value : nullptr;
+ }
+#else
_LIBCPP_ALWAYS_INLINE
- _LIBCPP_EXPLICIT
- operator bool() const {return !fail();}
+ _LIBCPP_EXPLICIT operator bool() const {return !fail();}
+#endif
+
_LIBCPP_ALWAYS_INLINE bool operator!() const {return fail();}
_LIBCPP_ALWAYS_INLINE iostate rdstate() const {return ios_base::rdstate();}
_LIBCPP_ALWAYS_INLINE void clear(iostate __state = goodbit) {ios_base::clear(__state);}
diff --git a/libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp b/libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp
index 0de889e549c..5f49c65bdfd 100644
--- a/libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp
+++ b/libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp
@@ -14,6 +14,7 @@
// operator unspecified-bool-type() const;
#include <ios>
+#include <type_traits>
#include <cassert>
int main()
@@ -22,4 +23,10 @@ int main()
assert(static_cast<bool>(ios) == !ios.fail());
ios.setstate(std::ios::failbit);
assert(static_cast<bool>(ios) == !ios.fail());
+ static_assert((!std::is_convertible<std::ios, void*>::value), "");
+ static_assert((!std::is_convertible<std::ios, int>::value), "");
+ static_assert((!std::is_convertible<std::ios const&, int>::value), "");
+#if TEST_STD_VER >= 11
+ static_assert((!std::is_convertible<std::ios, bool>::value), "");
+#endif
}
OpenPOWER on IntegriCloud