summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libcxx/include/tuple11
-rw-r--r--libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp14
2 files changed, 24 insertions, 1 deletions
diff --git a/libcxx/include/tuple b/libcxx/include/tuple
index c192d100e14..de30e86c72b 100644
--- a/libcxx/include/tuple
+++ b/libcxx/include/tuple
@@ -521,6 +521,13 @@ class _LIBCPP_TEMPLATE_VIS tuple
template <class ..._Args>
static constexpr bool __enable_implicit() {
return
+ __tuple_constructible<
+ tuple<_Args...>,
+ typename __make_tuple_types<tuple,
+ sizeof...(_Args) < sizeof...(_Tp) ?
+ sizeof...(_Args) :
+ sizeof...(_Tp)>::type
+ >::value &&
__tuple_convertible<
tuple<_Args...>,
typename __make_tuple_types<tuple,
@@ -547,7 +554,8 @@ class _LIBCPP_TEMPLATE_VIS tuple
{
template <class _Tuple>
static constexpr bool __enable_implicit() {
- return __tuple_convertible<_Tuple, tuple>::value;
+ return __tuple_constructible<_Tuple, tuple>::value
+ && __tuple_convertible<_Tuple, tuple>::value;
}
template <class _Tuple>
@@ -577,6 +585,7 @@ class _LIBCPP_TEMPLATE_VIS tuple
template <class _Tuple>
static constexpr bool __enable_implicit() {
return _And<
+ __tuple_constructible<_Tuple, tuple>,
__tuple_convertible<_Tuple, tuple>,
_PreferTupleLikeConstructor<_Tuple>
>::value;
diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp
index f343201447b..2c24f786a54 100644
--- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp
+++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp
@@ -46,6 +46,20 @@ struct D
explicit D(int i) : B(i) {}
};
+struct BonkersBananas {
+ template <class T>
+ operator T() &&;
+ template <class T, class = void>
+ explicit operator T() && = delete;
+};
+
+void test_bonkers_bananas_conversion() {
+ using ReturnType = std::tuple<int, int>;
+ static_assert(std::is_convertible<BonkersBananas, ReturnType>(), "");
+ static_assert(!std::is_constructible<ReturnType, BonkersBananas>(), "");
+
+}
+
int main(int, char**)
{
{
OpenPOWER on IntegriCloud