diff options
-rw-r--r-- | libcxx/include/tuple | 42 | ||||
-rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.fail.cpp | 33 | ||||
-rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp | 2 | ||||
-rw-r--r-- | libcxx/www/cxx2a_status.html | 2 | ||||
-rw-r--r-- | libcxx/www/upcoming_meeting.html | 3 |
5 files changed, 65 insertions, 17 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 < diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.fail.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.fail.cpp new file mode 100644 index 00000000000..abb8073a6a5 --- /dev/null +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.fail.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03 + +// <tuple> + +// template <class... Types> class tuple; + +// template <class Alloc> +// explicit(see-below) tuple(allocator_arg_t, const Alloc& a); + +// Make sure we get the explicit-ness of the constructor right. +// This is LWG 3158. + +#include <tuple> +#include <memory> + + +struct ExplicitDefault { explicit ExplicitDefault() { } }; + +std::tuple<ExplicitDefault> explicit_default_test() { + return {std::allocator_arg, std::allocator<int>()}; // expected-error {{chosen constructor is explicit in copy-initialization}} +} + +int main(int, char**) { + return 0; +} diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp index b0f957e3a37..13511fa5148 100644 --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc.pass.cpp @@ -13,7 +13,7 @@ // template <class... Types> class tuple; // template <class Alloc> -// tuple(allocator_arg_t, const Alloc& a); +// explicit(see-below) tuple(allocator_arg_t, const Alloc& a); // NOTE: this constructor does not currently support tags derived from // allocator_arg_t because libc++ has to deduce the parameter as a template diff --git a/libcxx/www/cxx2a_status.html b/libcxx/www/cxx2a_status.html index cc84bbe7328..6008c22068c 100644 --- a/libcxx/www/cxx2a_status.html +++ b/libcxx/www/cxx2a_status.html @@ -358,7 +358,7 @@ <tr><td><a href="https://wg21.link/LWG3182">3182</a></td><td>Specification of <tt>Same</tt> could be clearer</td><td>Kona</td><td></td></tr> <tr><td></td><td></td><td></td><td></td></tr> - <tr><td><a href="https://wg21.link/LWG2899">2899</a></td><td><tt>is_(nothrow_)move_constructible</tt> and <tt>tuple</tt>, <tt>optional</tt> and <tt>unique_ptr</tt></td><td>Cologne</td><td></td></tr> + <tr><td><a href="https://wg21.link/LWG2899">2899</a></td><td><tt>is_(nothrow_)move_constructible</tt> and <tt>tuple</tt>, <tt>optional</tt> and <tt>unique_ptr</tt></td><td>Cologne</td><td>Complete</td></tr> <tr><td><a href="https://wg21.link/LWG3055">3055</a></td><td><tt>path::operator+=(<i>single-character</i>)</tt> misspecified</td><td>Cologne</td><td></td></tr> <tr><td><a href="https://wg21.link/LWG3158">3158</a></td><td><tt>tuple(allocator_arg_t, const Alloc&)</tt> should be conditionally explicit</td><td>Cologne</td><td></td></tr> <tr><td><a href="https://wg21.link/LWG3169">3169</a></td><td><tt>ranges</tt> permutation generators discard useful information</td><td>Cologne</td><td></td></tr> diff --git a/libcxx/www/upcoming_meeting.html b/libcxx/www/upcoming_meeting.html index 29b5174ae30..7c7d2a28af2 100644 --- a/libcxx/www/upcoming_meeting.html +++ b/libcxx/www/upcoming_meeting.html @@ -61,7 +61,7 @@ <tr><th>Issue #</th><th>Has P/R</th><th>Issue Name</th><th>Meeting</th><th>Status</th></tr> <tr><td><a href="https://wg21.link/LWG2899">2899</a></td><td>Yes</td><td><tt>is_(nothrow_)move_constructible</tt> and <tt>tuple</tt>, <tt>optional</tt> and <tt>unique_ptr</tt></td><td>Cologne</td><td></td></tr> <tr><td><a href="https://wg21.link/LWG3055">3055</a></td><td>Yes</td><td><tt>path::operator+=(<i>single-character</i>)</tt> misspecified</td><td>Cologne</td><td></td></tr> -<tr><td><a href="https://wg21.link/LWG3158">3158</a></td><td>Yes</td><td><tt>tuple(allocator_arg_t, const Alloc&)</tt> should be conditionally explicit</td><td>Cologne</td><td></td></tr> +<tr><td><a href="https://wg21.link/LWG3158">3158</a></td><td>Yes</td><td><tt>tuple(allocator_arg_t, const Alloc&)</tt> should be conditionally explicit</td><td>Cologne</td><td>Complete</td></tr> <tr><td><a href="https://wg21.link/LWG3169">3169</a></td><td>Yes</td><td><tt>ranges</tt> permutation generators discard useful information</td><td>Cologne</td><td></td></tr> <tr><td><a href="https://wg21.link/LWG3183">3183</a></td><td>Yes</td><td>Normative permission to specialize Ranges variable templates</td><td>Cologne</td><td></td></tr> <tr><td><a href="https://wg21.link/LWG3184">3184</a></td><td>Yes</td><td>Inconsistencies in <tt>bind_front</tt> wording</td><td>Cologne</td><td></td></tr> @@ -95,7 +95,6 @@ <ul> <li>2899 - Louis</li> <li>3055 - Eric?</li> -<li>3158 - Louis</li> <li>3169 - We don't do ranges yet</li> <li>3183 - We don't do ranges yet</li> <li>3184 - We don't do bind_front yet</li> |