summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2017-01-13 18:03:46 +0000
committerEric Fiselier <eric@efcs.ca>2017-01-13 18:03:46 +0000
commitc8bd38a15da6cdf9aab68c0ec00efc825aca85ed (patch)
tree5f4992dec216ead8d05dee5cd6690d4953dced54
parent7f329becb715bfc4ba66ad3ff278be0cdf163404 (diff)
downloadbcm5719-llvm-c8bd38a15da6cdf9aab68c0ec00efc825aca85ed.tar.gz
bcm5719-llvm-c8bd38a15da6cdf9aab68c0ec00efc825aca85ed.zip
Revert "Rework fix for PR19460 - Use explicit bool as an extension instead."
This reverts commit 3a1b90a866b6d5d62a5f37fbfb3a1ee36cc70dd1. llvm-svn: 291921
-rw-r--r--libcxx/include/__config2
-rw-r--r--libcxx/include/experimental/string_view7
-rw-r--r--libcxx/include/ios17
3 files changed, 19 insertions, 7 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config
index c108b594b83..b30b15c6fdb 100644
--- a/libcxx/include/__config
+++ b/libcxx/include/__config
@@ -772,7 +772,7 @@ template <unsigned> struct __static_assert_check {};
#define _NOALIAS
#endif
-#if __has_extension(cxx_explicit_conversions) || defined(__IBMCPP__) || \
+#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) || \
(!defined(_LIBCPP_CXX03_LANG) && defined(__GNUC__)) // All supported GCC versions
# define _LIBCPP_EXPLICIT explicit
#else
diff --git a/libcxx/include/experimental/string_view b/libcxx/include/experimental/string_view
index 674f6c355fb..41c0d34d3c8 100644
--- a/libcxx/include/experimental/string_view
+++ b/libcxx/include/experimental/string_view
@@ -340,12 +340,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
// [string.view.ops], string operations:
template<class _Allocator>
_LIBCPP_INLINE_VISIBILITY
- // Clang's extended C++11 explict conversions don't work with
- // string_view in C++03.
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_EXPLICIT
-#endif
- operator basic_string<_CharT, _Traits, _Allocator>() const
+ _LIBCPP_EXPLICIT operator basic_string<_CharT, _Traits, _Allocator>() const
{ return basic_string<_CharT, _Traits, _Allocator>( begin(), end()); }
template<class _Allocator = allocator<_CharT> >
diff --git a/libcxx/include/ios b/libcxx/include/ios
index efee39fb533..b05ee4c785a 100644
--- a/libcxx/include/ios
+++ b/libcxx/include/ios
@@ -572,6 +572,13 @@ ios_base::exceptions(iostate __iostate)
clear(__rdstate_);
}
+#if defined(_LIBCPP_CXX03_LANG)
+struct _LIBCPP_TYPE_VIS_ONLY __cxx03_bool {
+ typedef void (__cxx03_bool::*__bool_type)();
+ void __true_value() {}
+};
+#endif
+
template <class _CharT, class _Traits>
class _LIBCPP_TEMPLATE_VIS basic_ios
: public ios_base
@@ -585,8 +592,18 @@ public:
typedef typename traits_type::pos_type pos_type;
typedef typename traits_type::off_type off_type;
+ // __true_value will generate undefined references when linking unless
+ // we give it internal linkage.
+
+#if defined(_LIBCPP_CXX03_LANG)
+ _LIBCPP_ALWAYS_INLINE
+ operator __cxx03_bool::__bool_type() const {
+ return !fail() ? &__cxx03_bool::__true_value : nullptr;
+ }
+#else
_LIBCPP_ALWAYS_INLINE
_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();}
OpenPOWER on IntegriCloud