diff options
author | Louis Dionne <ldionne@apple.com> | 2019-09-27 15:06:52 +0000 |
---|---|---|
committer | Louis Dionne <ldionne@apple.com> | 2019-09-27 15:06:52 +0000 |
commit | 59e26308e60a08a5a4534ba827744564c71d7aff (patch) | |
tree | 153a8db3ca1c30a66342e5a40c01cd1861508c5c /libcxx/include | |
parent | 7ca15ba73f67f1d3b6652cb19bbf78731e3b128d (diff) | |
download | bcm5719-llvm-59e26308e60a08a5a4534ba827744564c71d7aff.tar.gz bcm5719-llvm-59e26308e60a08a5a4534ba827744564c71d7aff.zip |
[libc++] Take 2: Implement LWG 3158
Summary:
LWG 3158 marks the allocator_arg_t constructor of std::tuple as
conditionnally explicit based on whether the default constructors
of the tuple's members are explicitly default constructible.
This was previously committed as r372778 and reverted in r372832 due to
the commit breaking LLVM's build in C++14 mode. This issue has now been
addressed.
Reviewers: mclow.lists
Subscribers: christof, jkorous, dexonsmith, libcxx-commits
Tags: #libc
Differential Revision: https://reviews.llvm.org/D65232
llvm-svn: 373092
Diffstat (limited to 'libcxx/include')
-rw-r--r-- | libcxx/include/tuple | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/libcxx/include/tuple b/libcxx/include/tuple index c33b48ab54c..c4cd3bc5495 100644 --- a/libcxx/include/tuple +++ b/libcxx/include/tuple @@ -500,20 +500,22 @@ class _LIBCPP_TEMPLATE_VIS tuple struct _CheckArgsConstructor<true, _Dummy> { template <class ..._Args> - static constexpr bool __enable_implicit_default() { + struct __enable_implicit_default // In C++03, there's no way to implement the resolution of LWG2510. #ifdef _LIBCPP_CXX03_LANG - return true; + : true_type #else - return __all<__is_implicitly_default_constructible<_Args>::value...>::value; + : __all<__is_implicitly_default_constructible<_Args>::value...> #endif - } + { }; template <class ..._Args> - static constexpr bool __enable_explicit_default() { - return __all<is_default_constructible<_Args>::value...>::value - && !__enable_implicit_default<_Args...>(); - } + struct __enable_explicit_default + : integral_constant<bool, + __all<is_default_constructible<_Args>::value...>::value && + !__enable_implicit_default<_Args...>::value + > + { }; template <class ..._Args> static constexpr bool __enable_explicit() { @@ -653,14 +655,14 @@ class _LIBCPP_TEMPLATE_VIS tuple public: template <bool _Dummy = true, _EnableIf< - _CheckArgsConstructor<_Dummy>::template __enable_implicit_default<_Tp...>() + _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...>() + _CheckArgsConstructor<_Dummy>::template __enable_explicit_default<_Tp...>::value , void*> = nullptr> explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR tuple() @@ -669,12 +671,12 @@ public: tuple(tuple const&) = default; tuple(tuple&&) = default; - template <class _AllocArgT, class _Alloc, bool _Dummy = true, class = _EnableIf< + template <class _AllocArgT, class _Alloc, bool _Dummy = true, _EnableIf< _And< _IsSame<allocator_arg_t, _AllocArgT>, - __dependent_type<is_default_constructible<_Tp>, _Dummy>... + typename _CheckArgsConstructor<_Dummy>::template __enable_implicit_default<_Tp...> >::value - > + , void*> = nullptr > _LIBCPP_INLINE_VISIBILITY tuple(_AllocArgT, _Alloc const& __a) @@ -683,6 +685,20 @@ public: 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 < |