Skip to content
  • Eric Fiselier's avatar
    57f00f2f
    [libcxx] Move tuple_size and tuple_element overloads for pair and array out of... · 57f00f2f
    Eric Fiselier authored
    [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
    57f00f2f
    [libcxx] Move tuple_size and tuple_element overloads for pair and array out of...
    Eric Fiselier authored
    [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
Loading