diff options
author | Eric Fiselier <eric@efcs.ca> | 2015-03-17 15:08:03 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2015-03-17 15:08:03 +0000 |
commit | 57f00f2f9ce96f474beba7394be05be56fce720d (patch) | |
tree | 92b216d6aa603cdaa4f83f4f7a4e2815ddbe7807 /libcxx/test/std/containers/sequences/array/array.tuple | |
parent | cb84eebb527a63b2775dbf4628f0112977d8cec9 (diff) | |
download | bcm5719-llvm-57f00f2f9ce96f474beba7394be05be56fce720d.tar.gz bcm5719-llvm-57f00f2f9ce96f474beba7394be05be56fce720d.zip |
[libcxx] Move tuple_size and tuple_element overloads for pair and array out of !defined(_LIBCPP_HAS_NO_VARIADICS) block.
Summary:
There is no reason to guard `tuple_size`, `tuple_element` and `get<I>(...)` for pair and array inside of `<__tuple>` so that they are only available when we have variadic templates.
This requires there be redundant declarations and definitions. It also makes it easy to get things wrong.
For example the following code should compile (and does in c++11).
```
#define _LIBCPP_HAS_NO_VARIADICS
#include <array>
int main()
{
static_assert((std::tuple_size<std::array<int, 10> volatile>::value == 10), "");
}
```
This patch lifts the non-variadic parts of `tuple_size`, `tuple_types`, and `get<I>(...)` to the top of `<__tuple>` where they don't require variadic templates. This patch also removes `<__tuple_03>` because there is no longer a need for it.
Reviewers: danalbert, K-ballo, mclow.lists
Reviewed By: mclow.lists
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D7774
llvm-svn: 232492
Diffstat (limited to 'libcxx/test/std/containers/sequences/array/array.tuple')
-rw-r--r-- | libcxx/test/std/containers/sequences/array/array.tuple/tuple_element.pass.cpp | 43 | ||||
-rw-r--r-- | libcxx/test/std/containers/sequences/array/array.tuple/tuple_size.pass.cpp | 28 |
2 files changed, 53 insertions, 18 deletions
diff --git a/libcxx/test/std/containers/sequences/array/array.tuple/tuple_element.pass.cpp b/libcxx/test/std/containers/sequences/array/array.tuple/tuple_element.pass.cpp index cd1dad60ade..91d6b4e5da2 100644 --- a/libcxx/test/std/containers/sequences/array/array.tuple/tuple_element.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/array.tuple/tuple_element.pass.cpp @@ -14,20 +14,41 @@ #include <array> #include <type_traits> -int main() +template <class T> +void test() { { - typedef double T; - typedef std::array<T, 3> C; - static_assert((std::is_same<std::tuple_element<0, C>::type, T>::value), ""); - static_assert((std::is_same<std::tuple_element<1, C>::type, T>::value), ""); - static_assert((std::is_same<std::tuple_element<2, C>::type, T>::value), ""); + typedef T Exp; + typedef std::array<T, 3> C; + static_assert((std::is_same<typename std::tuple_element<0, C>::type, Exp>::value), ""); + static_assert((std::is_same<typename std::tuple_element<1, C>::type, Exp>::value), ""); + static_assert((std::is_same<typename std::tuple_element<2, C>::type, Exp>::value), ""); + } + { + typedef T const Exp; + typedef std::array<T, 3> const C; + static_assert((std::is_same<typename std::tuple_element<0, C>::type, Exp>::value), ""); + static_assert((std::is_same<typename std::tuple_element<1, C>::type, Exp>::value), ""); + static_assert((std::is_same<typename std::tuple_element<2, C>::type, Exp>::value), ""); + } + { + typedef T volatile Exp; + typedef std::array<T, 3> volatile C; + static_assert((std::is_same<typename std::tuple_element<0, C>::type, Exp>::value), ""); + static_assert((std::is_same<typename std::tuple_element<1, C>::type, Exp>::value), ""); + static_assert((std::is_same<typename std::tuple_element<2, C>::type, Exp>::value), ""); } { - typedef int T; - typedef std::array<T, 3> C; - static_assert((std::is_same<std::tuple_element<0, C>::type, T>::value), ""); - static_assert((std::is_same<std::tuple_element<1, C>::type, T>::value), ""); - static_assert((std::is_same<std::tuple_element<2, C>::type, T>::value), ""); + typedef T const volatile Exp; + typedef std::array<T, 3> const volatile C; + static_assert((std::is_same<typename std::tuple_element<0, C>::type, Exp>::value), ""); + static_assert((std::is_same<typename std::tuple_element<1, C>::type, Exp>::value), ""); + static_assert((std::is_same<typename std::tuple_element<2, C>::type, Exp>::value), ""); } } + +int main() +{ + test<double>(); + test<int>(); +} diff --git a/libcxx/test/std/containers/sequences/array/array.tuple/tuple_size.pass.cpp b/libcxx/test/std/containers/sequences/array/array.tuple/tuple_size.pass.cpp index 83394b1e0c9..1e565d1946e 100644 --- a/libcxx/test/std/containers/sequences/array/array.tuple/tuple_size.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/array.tuple/tuple_size.pass.cpp @@ -13,16 +13,30 @@ #include <array> -int main() +template <class T, std::size_t N> +void test() { { - typedef double T; - typedef std::array<T, 3> C; - static_assert((std::tuple_size<C>::value == 3), ""); + typedef std::array<T, N> C; + static_assert((std::tuple_size<C>::value == N), ""); + } + { + typedef std::array<T const, N> C; + static_assert((std::tuple_size<C>::value == N), ""); + } + { + typedef std::array<T volatile, N> C; + static_assert((std::tuple_size<C>::value == N), ""); } { - typedef double T; - typedef std::array<T, 0> C; - static_assert((std::tuple_size<C>::value == 0), ""); + typedef std::array<T const volatile, N> C; + static_assert((std::tuple_size<C>::value == N), ""); } } + +int main() +{ + test<double, 0>(); + test<double, 3>(); + test<double, 5>(); +} |