summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/input.output/iostreams.base
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2016-12-30 12:44:58 +0000
committerEric Fiselier <eric@efcs.ca>2016-12-30 12:44:58 +0000
commit2131a71c0525c556b73441dc905e3956e8e54f70 (patch)
tree24528f56b798a8a14a40fa8822a805e821f37687 /libcxx/test/std/input.output/iostreams.base
parenta8d45de6ce8afbb529a24887ec7d8d66c3b9e04a (diff)
downloadbcm5719-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.cpp7
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
}
OpenPOWER on IntegriCloud