EricWF created this revision. EricWF added reviewers: mclow.lists, rsmith. EricWF added a subscriber: cfe-commits.
The reduced-arity-extension on tuple's implicit constructors breaks conforming code. eg ``` #include <tuple> #include <string> using namespace std; int count(tuple<string, string>) { return 2; } int count(tuple<string, string, string>) { return 3; } int main() { int c = count({"abc", "def"}); // expected-error {{call to 'count' is ambiguous}} } ``` To fix this the I removed the reduced-arity-extension only on the implicit constructors. This breaks the following code: ``` std::tuple<int, int, int> foo() { return {1, 2} } ``` But it still allows for ``` using Tup = std::tuple<int, int, int>; Tup foo() { return Tup{1, 2}; } ``` @Marshall should we provide a way to turn this ctor back on in case in breaks a bunch of real-world code? Maybe deprecate it for a release? See also: * http://llvm.org/PR27374 * http://wg21.link/lwg2419 https://reviews.llvm.org/D23495 Files: include/tuple Index: include/tuple =================================================================== --- include/tuple +++ include/tuple @@ -706,7 +706,7 @@ typename enable_if < _CheckArgsConstructor< - sizeof...(_Up) <= sizeof...(_Tp) + sizeof...(_Up) == sizeof...(_Tp) && !_PackExpandsToThisTuple<_Up...>::value >::template __enable_implicit<_Up...>(), bool @@ -716,26 +716,30 @@ tuple(_Up&&... __u) _NOEXCEPT_(( is_nothrow_constructible<base, - typename __make_tuple_indices<sizeof...(_Up)>::type, - typename __make_tuple_types<tuple, sizeof...(_Up)>::type, - typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type, - typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type, + typename __make_tuple_indices<sizeof...(_Tp)>::type, + __tuple_types<_Tp...>, + __tuple_indices<>, + __tuple_types<>, _Up... >::value )) - : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), - typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), - typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), - typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), + : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type{}, + __tuple_types<_Tp...>{}, + __tuple_indices<>{}, + __tuple_types<>{}, _VSTD::forward<_Up>(__u)...) {} template <class ..._Up, typename enable_if < _CheckArgsConstructor< sizeof...(_Up) <= sizeof...(_Tp) && !_PackExpandsToThisTuple<_Up...>::value - >::template __enable_explicit<_Up...>(), + >::template __enable_explicit<_Up...>() || + _CheckArgsConstructor< + sizeof...(_Up) < sizeof...(_Tp) + && !_PackExpandsToThisTuple<_Up...>::value + >::template __enable_implicit<_Up...>(), bool >::type = false >
Index: include/tuple =================================================================== --- include/tuple +++ include/tuple @@ -706,7 +706,7 @@ typename enable_if < _CheckArgsConstructor< - sizeof...(_Up) <= sizeof...(_Tp) + sizeof...(_Up) == sizeof...(_Tp) && !_PackExpandsToThisTuple<_Up...>::value >::template __enable_implicit<_Up...>(), bool @@ -716,26 +716,30 @@ tuple(_Up&&... __u) _NOEXCEPT_(( is_nothrow_constructible<base, - typename __make_tuple_indices<sizeof...(_Up)>::type, - typename __make_tuple_types<tuple, sizeof...(_Up)>::type, - typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type, - typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type, + typename __make_tuple_indices<sizeof...(_Tp)>::type, + __tuple_types<_Tp...>, + __tuple_indices<>, + __tuple_types<>, _Up... >::value )) - : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), - typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), - typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), - typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), + : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type{}, + __tuple_types<_Tp...>{}, + __tuple_indices<>{}, + __tuple_types<>{}, _VSTD::forward<_Up>(__u)...) {} template <class ..._Up, typename enable_if < _CheckArgsConstructor< sizeof...(_Up) <= sizeof...(_Tp) && !_PackExpandsToThisTuple<_Up...>::value - >::template __enable_explicit<_Up...>(), + >::template __enable_explicit<_Up...>() || + _CheckArgsConstructor< + sizeof...(_Up) < sizeof...(_Tp) + && !_PackExpandsToThisTuple<_Up...>::value + >::template __enable_implicit<_Up...>(), bool >::type = false >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits