diff options
| author | Eric Fiselier <eric@efcs.ca> | 2017-01-02 23:54:13 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2017-01-02 23:54:13 +0000 |
| commit | 1013fe3c0cfd7582e94ef2d4bfd79da7ea1a1289 (patch) | |
| tree | 570684bb1eddd70784f35953e4b830a73d31a2bc /libcxx/include/__tuple | |
| parent | 9877c1e71387c7a060095e228e1f7a1e65c18e52 (diff) | |
| download | bcm5719-llvm-1013fe3c0cfd7582e94ef2d4bfd79da7ea1a1289.tar.gz bcm5719-llvm-1013fe3c0cfd7582e94ef2d4bfd79da7ea1a1289.zip | |
Re-implement LWG 2770 - Fix tuple_size with structured bindings.
This patch implements the correct PR for LWG 2770. It also makes the primary
tuple_size template incomplete again which fixes part of llvm.org/PR31513.
llvm-svn: 290846
Diffstat (limited to 'libcxx/include/__tuple')
| -rw-r--r-- | libcxx/include/__tuple | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/libcxx/include/__tuple b/libcxx/include/__tuple index 775d7340b54..7aad0816366 100644 --- a/libcxx/include/__tuple +++ b/libcxx/include/__tuple @@ -22,19 +22,32 @@ _LIBCPP_BEGIN_NAMESPACE_STD -template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size {}; +template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size; + +struct __empty_tuple_size_base {}; + +template <class _Tp, class = void> +struct __tuple_size_base_type { + typedef __empty_tuple_size_base type; +}; + +template <class _Tp> +struct __tuple_size_base_type<_Tp, typename __void_t<decltype(tuple_size<_Tp>::value)>::type> +{ + typedef integral_constant<size_t, tuple_size<_Tp>::value> type; +}; template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size<const _Tp> - : public tuple_size<_Tp> {}; + : public __tuple_size_base_type<_Tp>::type {}; template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size<volatile _Tp> - : public tuple_size<_Tp> {}; + : public __tuple_size_base_type<_Tp>::type {}; template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size<const volatile _Tp> - : public tuple_size<_Tp> {}; + : public __tuple_size_base_type<_Tp>::type {}; template <size_t _Ip, class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_element; |

