Revert r372777: [libc++] Implement LWG 2510 and its follow-ups

This also reverts:
 - r372778: [libc++] Implement LWG 3158
 - r372782: [libc++] Try fixing tests that fail on GCC 5 and older
 - r372787: Purge mentions of GCC 4 from the test suite

Reason: the change breaks compilation of LLVM with libc++, for details see
http://lists.llvm.org/pipermail/libcxx-dev/2019-September/000599.html

llvm-svn: 372832
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: a3d337a9a7d00d82bb190c5e551181d3998f6b98
diff --git a/include/tuple b/include/tuple
index c4cd3bc..32bc869 100644
--- a/include/tuple
+++ b/include/tuple
@@ -19,7 +19,7 @@
 template <class... T>
 class tuple {
 public:
-    explicit(see-below) constexpr tuple();
+    constexpr tuple();
     explicit(see-below) tuple(const T&...);  // constexpr in C++14
     template <class... U>
         explicit(see-below) tuple(U&&...);  // constexpr in C++14
@@ -500,22 +500,9 @@
     struct _CheckArgsConstructor<true, _Dummy>
     {
         template <class ..._Args>
-        struct __enable_implicit_default
-            // In C++03, there's no way to implement the resolution of LWG2510.
-#ifdef _LIBCPP_CXX03_LANG
-            : true_type
-#else
-            : __all<__is_implicitly_default_constructible<_Args>::value...>
-#endif
-        { };
-
-        template <class ..._Args>
-        struct __enable_explicit_default
-            : integral_constant<bool,
-                __all<is_default_constructible<_Args>::value...>::value &&
-                !__enable_implicit_default<_Args...>::value
-            >
-        { };
+        static constexpr bool __enable_default() {
+            return __all<is_default_constructible<_Args>::value...>::value;
+        }
 
         template <class ..._Args>
         static constexpr bool __enable_explicit() {
@@ -654,29 +641,22 @@
         const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT;
 public:
 
-    template <bool _Dummy = true, _EnableIf<
-        _CheckArgsConstructor<_Dummy>::template __enable_implicit_default<_Tp...>::value
-    , void*> = nullptr>
-    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-    tuple()
-        _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
-
-    template <bool _Dummy = true, _EnableIf<
-        _CheckArgsConstructor<_Dummy>::template __enable_explicit_default<_Tp...>::value
-    , void*> = nullptr>
-    explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-    tuple()
+    template <bool _Dummy = true, class = typename enable_if<
+        _CheckArgsConstructor<_Dummy>::template __enable_default<_Tp...>()
+    >::type>
+    _LIBCPP_INLINE_VISIBILITY
+    _LIBCPP_CONSTEXPR tuple()
         _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
 
     tuple(tuple const&) = default;
     tuple(tuple&&) = default;
 
-    template <class _AllocArgT, class _Alloc, bool _Dummy = true, _EnableIf<
+    template <class _AllocArgT, class _Alloc, bool _Dummy = true, class = _EnableIf<
         _And<
             _IsSame<allocator_arg_t, _AllocArgT>,
-            typename _CheckArgsConstructor<_Dummy>::template __enable_implicit_default<_Tp...>
+           __dependent_type<is_default_constructible<_Tp>, _Dummy>...
        >::value
-      , void*> = nullptr
+      >
     >
     _LIBCPP_INLINE_VISIBILITY
     tuple(_AllocArgT, _Alloc const& __a)
@@ -685,20 +665,6 @@
                     typename __make_tuple_indices<sizeof...(_Tp), 0>::type(),
                     __tuple_types<_Tp...>()) {}
 
-    template <class _AllocArgT, class _Alloc, bool _Dummy = true, _EnableIf<
-        _And<
-            _IsSame<allocator_arg_t, _AllocArgT>,
-            typename _CheckArgsConstructor<_Dummy>::template __enable_explicit_default<_Tp...>
-       >::value
-      , void*> = nullptr
-    >
-    explicit _LIBCPP_INLINE_VISIBILITY
-    tuple(_AllocArgT, _Alloc const& __a)
-      : __base_(allocator_arg_t(), __a,
-                    __tuple_indices<>(), __tuple_types<>(),
-                    typename __make_tuple_indices<sizeof...(_Tp), 0>::type(),
-                    __tuple_types<_Tp...>()) {}
-
     template <bool _Dummy = true,
               typename enable_if
                       <