diff options
author | Eric Fiselier <eric@efcs.ca> | 2016-12-30 12:44:58 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2016-12-30 12:44:58 +0000 |
commit | 2131a71c0525c556b73441dc905e3956e8e54f70 (patch) | |
tree | 24528f56b798a8a14a40fa8822a805e821f37687 /libcxx/test/std/input.output/iostreams.base | |
parent | a8d45de6ce8afbb529a24887ec7d8d66c3b9e04a (diff) | |
download | bcm5719-llvm-2131a71c0525c556b73441dc905e3956e8e54f70.tar.gz bcm5719-llvm-2131a71c0525c556b73441dc905e3956e8e54f70.zip |
Fix PR19460 - std::ios is convertible to int.
std::basic_ios has an operator bool(). In C++11 and later
it is explicit, and only allows contextual implicit conversions.
However explicit isn't available in C++03 which causes std::istream (et al)
to have an implicit conversion to int. This can easily cause ambiguities
when calling operator<< and operator>>.
This patch uses a "bool-like" type in C++03 to work around this. The
"bool-like" type is an arbitrary pointer to member function type. It
will not convert to either int or void*, but will convert to bool.
llvm-svn: 290750
Diffstat (limited to 'libcxx/test/std/input.output/iostreams.base')
-rw-r--r-- | libcxx/test/std/input.output/iostreams.base/ios/iostate.flags/bool.pass.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
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 } |