[libcxx] r286779 - Implement LWG 2770 - Make tuple_size<T> defined for all T

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Sun Nov 13 12:43:51 PST 2016


Author: ericwf
Date: Sun Nov 13 14:43:50 2016
New Revision: 286779

URL: http://llvm.org/viewvc/llvm-project?rev=286779&view=rev
Log:
Implement LWG 2770 - Make tuple_size<T> defined for all T

Modified:
    libcxx/trunk/include/__tuple
    libcxx/trunk/include/tuple
    libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.fail.cpp
    libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp
    libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_v.fail.cpp

Modified: libcxx/trunk/include/__tuple
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__tuple?rev=286779&r1=286778&r2=286779&view=diff
==============================================================================
--- libcxx/trunk/include/__tuple (original)
+++ libcxx/trunk/include/__tuple Sun Nov 13 14:43:50 2016
@@ -22,7 +22,7 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size;
+template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size {};
 
 template <class _Tp>
 class _LIBCPP_TYPE_VIS_ONLY tuple_size<const _Tp>

Modified: libcxx/trunk/include/tuple
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/tuple?rev=286779&r1=286778&r2=286779&view=diff
==============================================================================
--- libcxx/trunk/include/tuple (original)
+++ libcxx/trunk/include/tuple Sun Nov 13 14:43:50 2016
@@ -84,7 +84,7 @@ template <class T, class Tuple>
   constexpr T make_from_tuple(Tuple&& t); // C++17
 
 // 20.4.1.4, tuple helper classes:
-template <class T> class tuple_size; // undefined
+template <class T> class tuple_size;
 template <class... T> class tuple_size<tuple<T...>>;
 template <class T>
  constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17

Modified: libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.fail.cpp?rev=286779&r1=286778&r2=286779&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.fail.cpp (original)
+++ libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.fail.cpp Sun Nov 13 14:43:50 2016
@@ -21,7 +21,7 @@
 
 int main()
 {
-    (void)std::tuple_size<std::tuple<> &>::value; // expected-error {{implicit instantiation of undefined template}}
-    (void)std::tuple_size<int>::value; // expected-error {{implicit instantiation of undefined template}}
-    (void)std::tuple_size<std::tuple<>*>::value; // expected-error {{implicit instantiation of undefined template}}
+    (void)std::tuple_size<std::tuple<> &>::value; // expected-error {{no member named 'value'}}
+    (void)std::tuple_size<int>::value; // expected-error {{no member named 'value'}}
+    (void)std::tuple_size<std::tuple<>*>::value; // expected-error {{no member named 'value'}}
 }

Modified: libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp?rev=286779&r1=286778&r2=286779&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp Sun Nov 13 14:43:50 2016
@@ -18,19 +18,36 @@
 // UNSUPPORTED: c++98, c++03
 
 #include <tuple>
+#include <utility>
+#include <array>
 #include <type_traits>
 
+template <class T, class = decltype(std::tuple_size<T>::value)>
+constexpr bool has_value(int) { return true; }
+template <class> constexpr bool has_value(long) { return false; }
+template <class T> constexpr bool has_value() { return has_value<T>(0); }
+
+
 template <class T, std::size_t N>
 void test()
 {
+    static_assert(has_value<T>(), "");
     static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
                                    std::tuple_size<T> >::value), "");
+    static_assert(has_value<const T>(), "");
     static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
                                    std::tuple_size<const T> >::value), "");
+    static_assert(has_value<volatile T>(), "");
     static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
                                    std::tuple_size<volatile T> >::value), "");
+
+    static_assert(has_value<const volatile T>(), "");
     static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
                                    std::tuple_size<const volatile T> >::value), "");
+    {
+        static_assert(!has_value<T &>(), "");
+        static_assert(!has_value<T *>(), "");
+    }
 }
 
 int main()
@@ -39,4 +56,13 @@ int main()
     test<std::tuple<int>, 1>();
     test<std::tuple<char, int>, 2>();
     test<std::tuple<char, char*, int>, 3>();
+    test<std::pair<int, void*>, 2>();
+    test<std::array<int, 42>, 42>();
+    {
+        static_assert(!has_value<void>(), "");
+        static_assert(!has_value<void*>(), "");
+        static_assert(!has_value<int>(), "");
+        static_assert(!has_value<std::pair<int, int>*>(), "");
+        static_assert(!has_value<std::array<int, 42>&>(), "");
+    }
 }

Modified: libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_v.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_v.fail.cpp?rev=286779&r1=286778&r2=286779&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_v.fail.cpp (original)
+++ libcxx/trunk/test/std/utilities/tuple/tuple.tuple/tuple.helper/tuple_size_v.fail.cpp Sun Nov 13 14:43:50 2016
@@ -22,5 +22,5 @@ int main()
     (void)std::tuple_size_v<std::tuple<> &>; // expected-note {{requested here}}
     (void)std::tuple_size_v<int>; // expected-note {{requested here}}
     (void)std::tuple_size_v<std::tuple<>*>; // expected-note {{requested here}}
-    // expected-error at tuple:* 3 {{implicit instantiation of undefined template}}
+    // expected-error at tuple:* 3 {{no member named 'value'}}
 }




More information about the cfe-commits mailing list