From 020b623a3b03a89aa56beba357bfa27c36cf13a7 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Wed, 4 Jan 2017 17:58:17 +0000 Subject: Implement the last bit of P0031: 'A Proposal to Add Constexpr Modifiers to reverse_iterator, move_iterator, array and Range Access' for C++17 llvm-svn: 290976 --- .../sequences/array/array.data/data_const.pass.cpp | 14 +++++ .../containers/sequences/array/iterators.pass.cpp | 33 +++++++++++ .../iterators/iterator.range/begin-end.pass.cpp | 68 ++++++++++++++++++++-- 3 files changed, 109 insertions(+), 6 deletions(-) (limited to 'libcxx/test') diff --git a/libcxx/test/std/containers/sequences/array/array.data/data_const.pass.cpp b/libcxx/test/std/containers/sequences/array/array.data/data_const.pass.cpp index 58840e94089..5be082eeb84 100644 --- a/libcxx/test/std/containers/sequences/array/array.data/data_const.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/array.data/data_const.pass.cpp @@ -14,6 +14,8 @@ #include #include +#include "test_macros.h" + // std::array is explicitly allowed to be initialized with A a = { init-list };. // Disable the missing braces warning for this reason. #include "disable_missing_braces_warning.h" @@ -36,4 +38,16 @@ int main() const T* p = c.data(); (void)p; // to placate scan-build } +#if TEST_STD_VER > 14 + { + typedef std::array C; + constexpr C c1{0,1,2,3,4}; + constexpr const C c2{0,1,2,3,4}; + + static_assert ( c1.data() == &c1[0], ""); + static_assert ( *c1.data() == c1[0], ""); + static_assert ( c2.data() == &c2[0], ""); + static_assert ( *c2.data() == c2[0], ""); + } +#endif } diff --git a/libcxx/test/std/containers/sequences/array/iterators.pass.cpp b/libcxx/test/std/containers/sequences/array/iterators.pass.cpp index 1f9904e1fa7..7d9050800de 100644 --- a/libcxx/test/std/containers/sequences/array/iterators.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/iterators.pass.cpp @@ -17,6 +17,10 @@ #include "test_macros.h" +// std::array is explicitly allowed to be initialized with A a = { init-list };. +// Disable the missing braces warning for this reason. +#include "disable_missing_braces_warning.h" + int main() { { @@ -109,4 +113,33 @@ int main() } } #endif +#if TEST_STD_VER > 14 + { + typedef std::array C; + constexpr C c{0,1,2,3,4}; + + static_assert ( c.begin() == std::begin(c), ""); + static_assert ( c.cbegin() == std::cbegin(c), ""); + static_assert ( c.end() == std::end(c), ""); + static_assert ( c.cend() == std::cend(c), ""); + + static_assert ( c.rbegin() == std::rbegin(c), ""); + static_assert ( c.crbegin() == std::crbegin(c), ""); + static_assert ( c.rend() == std::rend(c), ""); + static_assert ( c.crend() == std::crend(c), ""); + + static_assert ( std::begin(c) != std::end(c), ""); + static_assert ( std::rbegin(c) != std::rend(c), ""); + static_assert ( std::cbegin(c) != std::cend(c), ""); + static_assert ( std::crbegin(c) != std::crend(c), ""); + + static_assert ( *c.begin() == 0, ""); + static_assert ( *c.rbegin() == 4, ""); + + static_assert ( *std::begin(c) == 0, "" ); + static_assert ( *std::cbegin(c) == 0, "" ); + static_assert ( *std::rbegin(c) == 4, "" ); + static_assert ( *std::crbegin(c) == 4, "" ); + } +#endif } diff --git a/libcxx/test/std/iterators/iterator.range/begin-end.pass.cpp b/libcxx/test/std/iterators/iterator.range/begin-end.pass.cpp index 68186919198..a0774888d56 100644 --- a/libcxx/test/std/iterators/iterator.range/begin-end.pass.cpp +++ b/libcxx/test/std/iterators/iterator.range/begin-end.pass.cpp @@ -10,12 +10,25 @@ // XFAIL: c++03, c++98 // -// template auto begin(C& c) -> decltype(c.begin()); -// template auto begin(const C& c) -> decltype(c.begin()); -// template auto end(C& c) -> decltype(c.end()); -// template auto end(const C& c) -> decltype(c.end()); -// template reverse_iterator rbegin(initializer_list il); -// template reverse_iterator rend(initializer_list il); +// template constexpr auto begin(C& c) -> decltype(c.begin()); +// template constexpr auto begin(const C& c) -> decltype(c.begin()); +// template constexpr auto cbegin(const C& c) -> decltype(std::begin(c)); // C++14 +// template constexpr auto cend(const C& c) -> decltype(std::end(c)); // C++14 +// template constexpr auto end (C& c) -> decltype(c.end()); +// template constexpr auto end (const C& c) -> decltype(c.end()); +// template constexpr reverse_iterator rbegin(initializer_list il); +// template constexpr reverse_iterator rend (initializer_list il); +// +// template auto constexpr rbegin(C& c) -> decltype(c.rbegin()); // C++14 +// template auto constexpr rbegin(const C& c) -> decltype(c.rbegin()); // C++14 +// template auto constexpr rend(C& c) -> decltype(c.rend()); // C++14 +// template constexpr auto rend(const C& c) -> decltype(c.rend()); // C++14 +// template reverse_iterator constexpr rbegin(T (&array)[N]); // C++14 +// template reverse_iterator constexpr rend(T (&array)[N]); // C++14 +// template constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14 +// template constexpr auto crend(const C& c) -> decltype(std::rend(c)); // C++14 +// +// All of these are constexpr in C++17 #include "test_macros.h" @@ -26,6 +39,10 @@ #include #include +// std::array is explicitly allowed to be initialized with A a = { init-list };. +// Disable the missing braces warning for this reason. +#include "disable_missing_braces_warning.h" + template void test_const_container( const C & c, typename C::value_type val ) { assert ( std::begin(c) == c.begin()); @@ -142,4 +159,43 @@ int main(){ constexpr const int *e = std::cend(arrA); static_assert(e - b == 3, ""); #endif + +#if TEST_STD_VER > 14 + { + typedef std::array C; + constexpr const C c{0,1,2,3,4}; + + static_assert ( c.begin() == std::begin(c), ""); + static_assert ( c.cbegin() == std::cbegin(c), ""); + static_assert ( c.end() == std::end(c), ""); + static_assert ( c.cend() == std::cend(c), ""); + + static_assert ( c.rbegin() == std::rbegin(c), ""); + static_assert ( c.crbegin() == std::crbegin(c), ""); + static_assert ( c.rend() == std::rend(c), ""); + static_assert ( c.crend() == std::crend(c), ""); + + static_assert ( std::begin(c) != std::end(c), ""); + static_assert ( std::rbegin(c) != std::rend(c), ""); + static_assert ( std::cbegin(c) != std::cend(c), ""); + static_assert ( std::crbegin(c) != std::crend(c), ""); + + static_assert ( *c.begin() == 0, ""); + static_assert ( *c.rbegin() == 4, ""); + + static_assert ( *std::begin(c) == 0, "" ); + static_assert ( *std::cbegin(c) == 0, "" ); + static_assert ( *std::rbegin(c) == 4, "" ); + static_assert ( *std::crbegin(c) == 4, "" ); + } + + { + static constexpr const int c[] = {0,1,2,3,4}; + + static_assert ( *std::begin(c) == 0, "" ); + static_assert ( *std::cbegin(c) == 0, "" ); + static_assert ( *std::rbegin(c) == 4, "" ); + static_assert ( *std::crbegin(c) == 4, "" ); + } +#endif } -- cgit v1.2.3