summaryrefslogtreecommitdiffstats
path: root/libcxx/include/__tuple
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2017-01-02 23:54:13 +0000
committerEric Fiselier <eric@efcs.ca>2017-01-02 23:54:13 +0000
commit1013fe3c0cfd7582e94ef2d4bfd79da7ea1a1289 (patch)
tree570684bb1eddd70784f35953e4b830a73d31a2bc /libcxx/include/__tuple
parent9877c1e71387c7a060095e228e1f7a1e65c18e52 (diff)
downloadbcm5719-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/__tuple21
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;
OpenPOWER on IntegriCloud