diff --git a/libcxx/include/iterator b/libcxx/include/iterator index c6dd03340a75..28a946cb9361 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -1386,7 +1386,7 @@ operator+(typename __wrap_iter<_Iter>::difference_type __n, } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Tp* begin(_Tp (&__array)[_Np]) { @@ -1394,7 +1394,7 @@ begin(_Tp (&__array)[_Np]) } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Tp* end(_Tp (&__array)[_Np]) { @@ -1466,17 +1466,17 @@ reverse_iterator rend(initializer_list<_Ep> __il) } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 auto cbegin(const _Cp& __c) -> decltype(begin(__c)) { - return _VSTD::begin(__c); + return begin(__c); } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 auto cend(const _Cp& __c) -> decltype(end(__c)) { - return _VSTD::end(__c); + return end(__c); } template diff --git a/libcxx/test/iterators/iterator.range/begin-end.pass.cpp b/libcxx/test/iterators/iterator.range/begin-end.pass.cpp index 65d1a7bd9102..abb6433e232e 100644 --- a/libcxx/test/iterators/iterator.range/begin-end.pass.cpp +++ b/libcxx/test/iterators/iterator.range/begin-end.pass.cpp @@ -52,7 +52,7 @@ void test_const_container( const std::initializer_list & c, T val ) { assert ( std::end(c) == c.end()); #if _LIBCPP_STD_VER > 11 // initializer_list doesn't have cbegin/cend/rbegin/rend -// but std::cbegin(),etc work (b/c they're general fn templates) +// but std::cbegin(),etc work (b/c they're general fn templates) // assert ( std::cbegin(c) == c.cbegin()); // assert ( std::cbegin(c) != c.cend()); // assert ( std::cend(c) == c.cend()); @@ -104,6 +104,20 @@ void test_container( std::initializer_list & c, T val ) { #endif } +template +void test_const_array( const T (&array)[Sz] ) { + assert ( std::begin(array) == array ); + assert (*std::begin(array) == array[0] ); + assert ( std::begin(array) != std::end(array)); + assert ( std::end(array) == array + Sz); +#if _LIBCPP_STD_VER > 11 + assert ( std::cbegin(array) == array ); + assert (*std::cbegin(array) == array[0] ); + assert ( std::cbegin(array) != std::cend(array)); + assert ( std::cend(array) == array + Sz); +#endif + } + int main(){ std::vector v; v.push_back(1); std::list l; l.push_back(2); @@ -119,6 +133,14 @@ int main(){ test_const_container ( l, 2 ); test_const_container ( a, 3 ); test_const_container ( il, 4 ); + + static constexpr int arrA [] { 1, 2, 3 }; + test_const_array ( arrA ); +#if _LIBCPP_STD_VER > 11 + constexpr const int *b = std::cbegin(arrA); + constexpr const int *e = std::cend(arrA); + static_assert(e - b == 3, ""); +#endif } #else