Revert "Rework fix for PR19460 - Use explicit bool as an extension instead."

This reverts commit 3a1b90a866b6d5d62a5f37fbfb3a1ee36cc70dd1.

llvm-svn: 291921
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: c8bd38a15da6cdf9aab68c0ec00efc825aca85ed
diff --git a/include/__config b/include/__config
index c108b59..b30b15c 100644
--- a/include/__config
+++ b/include/__config
@@ -772,7 +772,7 @@
 #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/include/experimental/string_view b/include/experimental/string_view
index 674f6c3..41c0d34 100644
--- a/include/experimental/string_view
+++ b/include/experimental/string_view
@@ -340,12 +340,7 @@
         // [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/include/ios b/include/ios
index efee39f..b05ee4c 100644
--- a/include/ios
+++ b/include/ios
@@ -572,6 +572,13 @@
     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 @@
     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();}