lefticus updated this revision to Diff 71668. lefticus added a comment. Add C++1z check around constexpr tests, based on mclow's feedback
https://reviews.llvm.org/D22584 Files: include/array include/iterator test/std/containers/sequences/array/at.pass.cpp test/std/containers/sequences/array/begin.pass.cpp test/std/containers/sequences/array/front_back.pass.cpp test/std/containers/sequences/array/indexing.pass.cpp test/std/containers/sequences/array/iterators.pass.cpp test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp
Index: test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp =================================================================== --- test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp +++ test/std/iterators/iterator.primitives/iterator.operations/prev.pass.cpp @@ -33,12 +33,23 @@ int main() { - const char* s = "1234567890"; - test(bidirectional_iterator<const char*>(s+10), 10, bidirectional_iterator<const char*>(s)); - test(random_access_iterator<const char*>(s+10), 10, random_access_iterator<const char*>(s)); - test(s+10, 10, s); - - test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s)); - test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s)); - test(s+1, s); + { + const char* s = "1234567890"; + test(bidirectional_iterator<const char*>(s+10), 10, bidirectional_iterator<const char*>(s)); + test(random_access_iterator<const char*>(s+10), 10, random_access_iterator<const char*>(s)); + test(s+10, 10, s); + + test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s)); + test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s)); + test(s+1, s); + } + +#if TEST_STD_VER > 14 + { + constexpr const char* s = "1234567890"; + static_assert(std::prev(s+10, 10) == s); + static_assert(std::prev(s+1) == s); + } +#endif + } Index: test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp =================================================================== --- test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp +++ test/std/iterators/iterator.primitives/iterator.operations/next.pass.cpp @@ -35,16 +35,27 @@ int main() { - const char* s = "1234567890"; - test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)); - test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)); - test(bidirectional_iterator<const char*>(s), 10, bidirectional_iterator<const char*>(s+10)); - test(random_access_iterator<const char*>(s), 10, random_access_iterator<const char*>(s+10)); - test(s, 10, s+10); - - test(input_iterator<const char*>(s), input_iterator<const char*>(s+1)); - test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1)); - test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1)); - test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1)); - test(s, s+1); + { + const char* s = "1234567890"; + test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)); + test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)); + test(bidirectional_iterator<const char*>(s), 10, bidirectional_iterator<const char*>(s+10)); + test(random_access_iterator<const char*>(s), 10, random_access_iterator<const char*>(s+10)); + test(s, 10, s+10); + + test(input_iterator<const char*>(s), input_iterator<const char*>(s+1)); + test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1)); + test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1)); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1)); + test(s, s+1); + } + +#if TEST_STD_VER > 14 + { + constexpr const char* s = "1234567890"; + static_assert(std::next(s, 10) == s+10); + static_assert(std::next(s) == s+1); + } +#endif + } Index: test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp =================================================================== --- test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp +++ test/std/iterators/iterator.primitives/iterator.operations/distance.pass.cpp @@ -31,10 +31,21 @@ int main() { - const char* s = "1234567890"; - test(input_iterator<const char*>(s), input_iterator<const char*>(s+10), 10); - test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+10), 10); - test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+10), 10); - test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+10), 10); - test(s, s+10, 10); + { + const char* s = "1234567890"; + test(input_iterator<const char*>(s), input_iterator<const char*>(s+10), 10); + test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+10), 10); + test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+10), 10); + test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+10), 10); + test(s, s+10, 10); + } + + +#if TEST_STD_VER > 14 + { + constexpr const char* s = "1234567890"; + static_assert(std::distance(s, s+10) == 10); + } +#endif + } Index: test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp =================================================================== --- test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp +++ test/std/iterators/iterator.primitives/iterator.operations/advance.pass.cpp @@ -31,15 +31,39 @@ assert(i == x); } + +#if TEST_STD_VER > 14 +template <class It> +constexpr +auto +static_test(It i, typename std::iterator_traits<It>::difference_type n) +{ + std::advance(i, n); + return i; +} +#endif + int main() { - const char* s = "1234567890"; - test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)); - test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)); - test(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10)); - test(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s)); - test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); - test(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s)); - test(s+5, 5, s+10); - test(s+5, -5, s); + { + const char* s = "1234567890"; + test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10)); + test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10)); + test(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10)); + test(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s)); + test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10)); + test(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s)); + test(s+5, 5, s+10); + test(s+5, -5, s); + } + +#if TEST_STD_VER > 14 + { + constexpr const char* s = "1234567890"; + static_assert(static_test(s, 10) == s+10); + static_assert(static_test(s+5, 5) == s+10); + static_assert(static_test(s+5, -5) == s); + } +#endif } + Index: test/std/containers/sequences/array/iterators.pass.cpp =================================================================== --- test/std/containers/sequences/array/iterators.pass.cpp +++ test/std/containers/sequences/array/iterators.pass.cpp @@ -14,6 +14,7 @@ #include <array> #include <iterator> #include <cassert> +#include "test_macros.h" int main() { @@ -107,4 +108,68 @@ } } #endif + + +#if TEST_STD_VER > 14 + { // P0031 testing conextpr versions of iterators + { + typedef std::array<int, 5> C; + + constexpr C c{}; + static_assert ( c.begin() == std::begin(c)); + static_assert ( c.cbegin() == std::cbegin(c)); + static_assert ( c.rbegin() == std::rbegin(c)); + static_assert ( c.crbegin() == std::crbegin(c)); + static_assert ( c.end() == std::end(c)); + static_assert ( c.cend() == std::cend(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)); + } + { + typedef std::array<int, 0> C; + constexpr C::iterator ii1{}, ii2{}; + constexpr C::iterator ii4 = ii1; + constexpr C::const_iterator cii{}; + static_assert ( ii1 == ii2 ); + static_assert ( ii1 == ii4 ); + + static_assert (!(ii1 != ii2 )); + + static_assert ( (ii1 == cii )); + static_assert ( (cii == ii1 )); + static_assert (!(ii1 != cii )); + static_assert (!(cii != ii1 )); + static_assert (!(ii1 < cii )); + static_assert (!(cii < ii1 )); + static_assert ( (ii1 <= cii )); + static_assert ( (cii <= ii1 )); + static_assert (!(ii1 > cii )); + static_assert (!(cii > ii1 )); + static_assert ( (ii1 >= cii )); + static_assert ( (cii >= ii1 )); + static_assert (cii - ii1 == 0); + static_assert (ii1 - cii == 0); + + constexpr C c{}; + static_assert ( c.begin() == std::begin(c)); + static_assert ( c.cbegin() == std::cbegin(c)); + static_assert ( c.rbegin() == std::rbegin(c)); + static_assert ( c.crbegin() == std::crbegin(c)); + static_assert ( c.end() == std::end(c)); + static_assert ( c.cend() == std::cend(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)); + } + } +#endif } Index: test/std/containers/sequences/array/indexing.pass.cpp =================================================================== --- test/std/containers/sequences/array/indexing.pass.cpp +++ test/std/containers/sequences/array/indexing.pass.cpp @@ -9,9 +9,9 @@ // <array> -// reference operator[] (size_type) +// reference operator[] (size_type); // constexpr in C++1z // const_reference operator[] (size_type); // constexpr in C++14 -// reference at (size_type) +// reference at (size_type); // constexpr in C++1z // const_reference at (size_type); // constexpr in C++14 #include <array> @@ -23,6 +23,24 @@ // Disable the missing braces warning for this reason. #include "disable_missing_braces_warning.h" + +#if TEST_STD_VER > 14 +constexpr auto constexpr_array_usage() +{ + typedef double T; + typedef std::array<T, 3> C; + C c = {1, 2, 3.5}; + + T &t1 = c[0]; + t1 = 0; + + T &t2 = c[2]; + t2 = 2.5; + return c; +} +#endif + + int main() { { @@ -63,4 +81,12 @@ } #endif +#if TEST_STD_VER > 14 + { + constexpr auto c = constexpr_array_usage(); + static_assert (c[0] == 0); + static_assert (c[2] == 2.5); + } +#endif + } Index: test/std/containers/sequences/array/front_back.pass.cpp =================================================================== --- test/std/containers/sequences/array/front_back.pass.cpp +++ test/std/containers/sequences/array/front_back.pass.cpp @@ -9,8 +9,8 @@ // <array> -// reference front(); -// reference back(); +// reference front(); // constexpr in C++1z +// reference back(); // constexpr in C++1z // const_reference front(); // constexpr in C++14 // const_reference back(); // constexpr in C++14 @@ -23,6 +23,22 @@ // Disable the missing braces warning for this reason. #include "disable_missing_braces_warning.h" +#if TEST_STD_VER > 14 +constexpr auto constexpr_array_usage() +{ + typedef double T; + typedef std::array<T, 3> C; + C c = {1, 2, 3.5}; + + T &t1 = c.front(); + t1 = 0; + T &t2 = c.back(); + t2 = 2.5; + return c; +} +#endif + + int main() { { @@ -65,4 +81,13 @@ } #endif +#if TEST_STD_VER > 14 + { + constexpr auto c = constexpr_array_usage(); + static_assert (c.front() == 0); + static_assert (c.back() == 2.5); + } +#endif + + } Index: test/std/containers/sequences/array/begin.pass.cpp =================================================================== --- test/std/containers/sequences/array/begin.pass.cpp +++ test/std/containers/sequences/array/begin.pass.cpp @@ -18,6 +18,19 @@ // Disable the missing braces warning for this reason. #include "disable_missing_braces_warning.h" + +#if TEST_STD_VER > 14 +constexpr auto constexpr_array_usage() +{ + typedef double T; + typedef std::array<T, 3> C; + C c = {1, 2, 3.5}; + C::iterator i = c.begin(); + *i = 5.5; + return c; +} +#endif + int main() { { @@ -31,4 +44,12 @@ *i = 5.5; assert(c[0] == 5.5); } + + +#if TEST_STD_VER > 14 + { + constexpr c = constexpr_array_usage(); + static_assert(c[0] == 5.5); + } +#endif } Index: test/std/containers/sequences/array/at.pass.cpp =================================================================== --- test/std/containers/sequences/array/at.pass.cpp +++ test/std/containers/sequences/array/at.pass.cpp @@ -10,9 +10,9 @@ // XFAIL: libcpp-no-exceptions // <array> -// reference operator[] (size_type) +// reference operator[] (size_type); // constexpr in C++1z // const_reference operator[] (size_type); // constexpr in C++14 -// reference at (size_type) +// reference at (size_type); // constexpr in C++1z // const_reference at (size_type); // constexpr in C++14 #include <array> @@ -24,6 +24,22 @@ // Disable the missing braces warning for this reason. #include "disable_missing_braces_warning.h" +#if TEST_STD_VER > 14 +constexpr auto constexpr_array_usage() +{ + typedef double T; + typedef std::array<T, 3> C; + C c = {1, 2, 3.5}; + + T &t1 = c.at(0); + t1 = 0; + + T &t2 = c.at(2); + t2 = 2.5; + return c; +} +#endif + int main() { { @@ -71,4 +87,13 @@ } #endif +#if TEST_STD_VER > 14 + { + constexpr auto c = constexpr_array_usage(); + static_assert (c.at(0) == 0); + static_assert (c.at(2) == 2.5); + } +#endif + + } Index: include/iterator =================================================================== --- include/iterator +++ include/iterator @@ -372,25 +372,25 @@ bool failed() const noexcept; }; -template <class C> auto begin(C& c) -> decltype(c.begin()); -template <class C> auto begin(const C& c) -> decltype(c.begin()); -template <class C> auto end(C& c) -> decltype(c.end()); -template <class C> auto end(const C& c) -> decltype(c.end()); -template <class T, size_t N> T* begin(T (&array)[N]); -template <class T, size_t N> T* end(T (&array)[N]); - -template <class C> auto cbegin(const C& c) -> decltype(std::begin(c)); // C++14 -template <class C> auto cend(const C& c) -> decltype(std::end(c)); // C++14 -template <class C> auto rbegin(C& c) -> decltype(c.rbegin()); // C++14 -template <class C> auto rbegin(const C& c) -> decltype(c.rbegin()); // C++14 -template <class C> auto rend(C& c) -> decltype(c.rend()); // C++14 -template <class C> auto rend(const C& c) -> decltype(c.rend()); // C++14 +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto begin(C& c) -> decltype(c.begin()); +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto begin(const C& c) -> decltype(c.begin()); +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto end(C& c) -> decltype(c.end()); +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto end(const C& c) -> decltype(c.end()); +template <class T, size_t N> _LIBCPP_CONSTEXPR_AFTER_CXX14 T* begin(T (&array)[N]); +template <class T, size_t N> _LIBCPP_CONSTEXPR_AFTER_CXX14 T* end(T (&array)[N]); + +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto cbegin(const C& c) -> decltype(std::begin(c)); // C++14 +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto cend(const C& c) -> decltype(std::end(c)); // C++14 +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rbegin(C& c) -> decltype(c.rbegin()); // C++14 +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rbegin(const C& c) -> decltype(c.rbegin()); // C++14 +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rend(C& c) -> decltype(c.rend()); // C++14 +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rend(const C& c) -> decltype(c.rend()); // C++14 template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il); // C++14 template <class E> reverse_iterator<const E*> rend(initializer_list<E> il); // C++14 -template <class T, size_t N> reverse_iterator<T*> rbegin(T (&array)[N]); // C++14 -template <class T, size_t N> reverse_iterator<T*> rend(T (&array)[N]); // C++14 -template <class C> auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14 -template <class C> auto crend(const C& c) -> decltype(std::rend(c)); // C++14 +template <class T, size_t N> _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator<T*> rbegin(T (&array)[N]); // C++14 +template <class T, size_t N> _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator<T*> rend(T (&array)[N]); // C++14 +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14 +template <class C> _LIBCPP_CONSTEXPR_AFTER_CXX14 auto crend(const C& c) -> decltype(std::rend(c)); // C++14 // 24.8, container access: template <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17 @@ -523,16 +523,16 @@ }; template <class _InputIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 void __advance(_InputIter& __i, typename iterator_traits<_InputIter>::difference_type __n, input_iterator_tag) { for (; __n > 0; --__n) ++__i; } template <class _BiDirIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 void __advance(_BiDirIter& __i, typename iterator_traits<_BiDirIter>::difference_type __n, bidirectional_iterator_tag) { @@ -545,23 +545,23 @@ } template <class _RandIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 void __advance(_RandIter& __i, typename iterator_traits<_RandIter>::difference_type __n, random_access_iterator_tag) { __i += __n; } template <class _InputIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 void advance(_InputIter& __i, typename iterator_traits<_InputIter>::difference_type __n) { __advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category()); } template <class _InputIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 typename iterator_traits<_InputIter>::difference_type __distance(_InputIter __first, _InputIter __last, input_iterator_tag) { @@ -572,23 +572,23 @@ } template <class _RandIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 typename iterator_traits<_RandIter>::difference_type __distance(_RandIter __first, _RandIter __last, random_access_iterator_tag) { return __last - __first; } template <class _InputIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 typename iterator_traits<_InputIter>::difference_type distance(_InputIter __first, _InputIter __last) { return __distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category()); } template <class _InputIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _InputIter next(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n = 1, @@ -599,7 +599,7 @@ } template <class _BidiretionalIter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _BidiretionalIter prev(_BidiretionalIter __x, typename iterator_traits<_BidiretionalIter>::difference_type __n = 1, @@ -627,109 +627,109 @@ typedef typename iterator_traits<_Iter>::reference reference; typedef typename iterator_traits<_Iter>::pointer pointer; - _LIBCPP_INLINE_VISIBILITY reverse_iterator() : current() {} - _LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {} - template <class _Up> _LIBCPP_INLINE_VISIBILITY reverse_iterator(const reverse_iterator<_Up>& __u) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator() : current() {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {} + template <class _Up> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator(const reverse_iterator<_Up>& __u) : __t(__u.base()), current(__u.base()) {} - _LIBCPP_INLINE_VISIBILITY _Iter base() const {return current;} - _LIBCPP_INLINE_VISIBILITY reference operator*() const {_Iter __tmp = current; return *--__tmp;} - _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return _VSTD::addressof(operator*());} - _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator++() {--current; return *this;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator operator++(int) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _Iter base() const {return current;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference operator*() const {_Iter __tmp = current; return *--__tmp;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 pointer operator->() const {return _VSTD::addressof(operator*());} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator& operator++() {--current; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator operator++(int) {reverse_iterator __tmp(*this); --current; return __tmp;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator--() {++current; return *this;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator operator--(int) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator& operator--() {++current; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator operator--(int) {reverse_iterator __tmp(*this); ++current; return __tmp;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator operator+ (difference_type __n) const + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator operator+ (difference_type __n) const {return reverse_iterator(current - __n);} - _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator+=(difference_type __n) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator& operator+=(difference_type __n) {current -= __n; return *this;} - _LIBCPP_INLINE_VISIBILITY reverse_iterator operator- (difference_type __n) const + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator operator- (difference_type __n) const {return reverse_iterator(current + __n);} - _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator-=(difference_type __n) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator& operator-=(difference_type __n) {current += __n; return *this;} - _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference operator[](difference_type __n) const {return *(*this + __n);} }; template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { return __x.base() == __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { return __x.base() > __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { return __x.base() != __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { return __x.base() < __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { return __x.base() <= __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { return __x.base() >= __y.base(); } #ifndef _LIBCPP_CXX03_LANG template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) -> decltype(__y.base() - __x.base()) { return __y.base() - __x.base(); } #else template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 typename reverse_iterator<_Iter1>::difference_type operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) { return __y.base() - __x.base(); } #endif template <class _Iter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator<_Iter> operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x) { return reverse_iterator<_Iter>(__x.base() - __n); } #if _LIBCPP_STD_VER > 11 template <class _Iter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator<_Iter> make_reverse_iterator(_Iter __i) { return reverse_iterator<_Iter>(__i); @@ -1040,112 +1040,112 @@ typedef typename iterator_traits<iterator_type>::reference reference; #endif - _LIBCPP_INLINE_VISIBILITY move_iterator() : __i() {} - _LIBCPP_INLINE_VISIBILITY explicit move_iterator(_Iter __x) : __i(__x) {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator() : __i() {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 explicit move_iterator(_Iter __x) : __i(__x) {} template <class _Up> _LIBCPP_INLINE_VISIBILITY move_iterator(const move_iterator<_Up>& __u) : __i(__u.base()) {} - _LIBCPP_INLINE_VISIBILITY _Iter base() const {return __i;} - _LIBCPP_INLINE_VISIBILITY reference operator*() const { + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _Iter base() const {return __i;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference operator*() const { return static_cast<reference>(*__i); } - _LIBCPP_INLINE_VISIBILITY pointer operator->() const { return __i;} - _LIBCPP_INLINE_VISIBILITY move_iterator& operator++() {++__i; return *this;} - _LIBCPP_INLINE_VISIBILITY move_iterator operator++(int) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 pointer operator->() const { return __i;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator& operator++() {++__i; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator operator++(int) {move_iterator __tmp(*this); ++__i; return __tmp;} - _LIBCPP_INLINE_VISIBILITY move_iterator& operator--() {--__i; return *this;} - _LIBCPP_INLINE_VISIBILITY move_iterator operator--(int) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator& operator--() {--__i; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator operator--(int) {move_iterator __tmp(*this); --__i; return __tmp;} - _LIBCPP_INLINE_VISIBILITY move_iterator operator+ (difference_type __n) const + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator operator+ (difference_type __n) const {return move_iterator(__i + __n);} - _LIBCPP_INLINE_VISIBILITY move_iterator& operator+=(difference_type __n) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator& operator+=(difference_type __n) {__i += __n; return *this;} - _LIBCPP_INLINE_VISIBILITY move_iterator operator- (difference_type __n) const + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator operator- (difference_type __n) const {return move_iterator(__i - __n);} - _LIBCPP_INLINE_VISIBILITY move_iterator& operator-=(difference_type __n) + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator& operator-=(difference_type __n) {__i -= __n; return *this;} - _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reference operator[](difference_type __n) const { return static_cast<reference>(__i[__n]); } }; template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { return __x.base() == __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { return __x.base() < __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { return __x.base() != __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { return __x.base() > __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { return __x.base() >= __y.base(); } template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 bool operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { return __x.base() <= __y.base(); } #ifndef _LIBCPP_CXX03_LANG template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) -> decltype(__x.base() - __y.base()) { return __x.base() - __y.base(); } #else template <class _Iter1, class _Iter2> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 typename move_iterator<_Iter1>::difference_type operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) { return __x.base() - __y.base(); } #endif template <class _Iter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator<_Iter> operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x) { return move_iterator<_Iter>(__x.base() + __n); } template <class _Iter> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 move_iterator<_Iter> make_move_iterator(_Iter __i) { @@ -1569,31 +1569,31 @@ #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN) template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto begin(_Cp& __c) -> decltype(__c.begin()) { return __c.begin(); } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto begin(const _Cp& __c) -> decltype(__c.begin()) { return __c.begin(); } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto end(_Cp& __c) -> decltype(__c.end()) { return __c.end(); } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto end(const _Cp& __c) -> decltype(__c.end()) { @@ -1603,14 +1603,14 @@ #if _LIBCPP_STD_VER > 11 template <class _Tp, size_t _Np> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np]) { return reverse_iterator<_Tp*>(__array + _Np); } template <class _Tp, size_t _Np> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np]) { return reverse_iterator<_Tp*>(__array); @@ -1645,42 +1645,42 @@ } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rbegin(_Cp& __c) -> decltype(__c.rbegin()) { return __c.rbegin(); } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rbegin(const _Cp& __c) -> decltype(__c.rbegin()) { return __c.rbegin(); } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rend(_Cp& __c) -> decltype(__c.rend()) { return __c.rend(); } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rend(const _Cp& __c) -> decltype(__c.rend()) { return __c.rend(); } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto crbegin(const _Cp& __c) -> decltype(_VSTD::rbegin(__c)) { return _VSTD::rbegin(__c); } template <class _Cp> -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c)) { return _VSTD::rend(__c); Index: include/array =================================================================== --- include/array +++ include/array @@ -37,39 +37,39 @@ void swap(array& a) noexcept(is_nothrow_swappable_v<T>); // iterators: - iterator begin() noexcept; - const_iterator begin() const noexcept; - iterator end() noexcept; - const_iterator end() const noexcept; + iterator begin() noexcept; // constexpr in C++17 + const_iterator begin() const noexcept; // constexpr in C++17 + iterator end() noexcept; // constexpr in C++17 + const_iterator end() const noexcept; // constexpr in C++17 - reverse_iterator rbegin() noexcept; - const_reverse_iterator rbegin() const noexcept; - reverse_iterator rend() noexcept; - const_reverse_iterator rend() const noexcept; + reverse_iterator rbegin() noexcept; // constexpr in C++17 + const_reverse_iterator rbegin() const noexcept; // constexpr in C++17 + reverse_iterator rend() noexcept; // constexpr in C++17 + const_reverse_iterator rend() const noexcept; // constexpr in C++17 - const_iterator cbegin() const noexcept; - const_iterator cend() const noexcept; - const_reverse_iterator crbegin() const noexcept; - const_reverse_iterator crend() const noexcept; + const_iterator cbegin() const noexcept; // constexpr in C++17 + const_iterator cend() const noexcept; // constexpr in C++17 + const_reverse_iterator crbegin() const noexcept; // constexpr in C++17 + const_reverse_iterator crend() const noexcept; // constexpr in C++17 // capacity: constexpr size_type size() const noexcept; constexpr size_type max_size() const noexcept; constexpr bool empty() const noexcept; // element access: - reference operator[](size_type n); + reference operator[](size_type n); // constexpr in C++17 const_reference operator[](size_type n) const; // constexpr in C++14 const_reference at(size_type n) const; // constexpr in C++14 - reference at(size_type n); + reference at(size_type n); // constexpr in C++17 - reference front(); + reference front(); // constexpr in C++17 const_reference front() const; // constexpr in C++14 - reference back(); + reference back(); // constexpr in C++17 const_reference back() const; // constexpr in C++14 - T* data() noexcept; - const T* data() const noexcept; + T* data() noexcept; // constexpr in C++17 + const T* data() const noexcept; // constexpr in C++17 }; template <class T, size_t N> @@ -152,31 +152,31 @@ { _VSTD::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);} // iterators: - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 iterator begin() _NOEXCEPT {return iterator(__elems_);} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 const_iterator begin() const _NOEXCEPT {return const_iterator(__elems_);} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 iterator end() _NOEXCEPT {return iterator(__elems_ + _Size);} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 const_iterator end() const _NOEXCEPT {return const_iterator(__elems_ + _Size);} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 const_iterator cbegin() const _NOEXCEPT {return begin();} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 const_iterator cend() const _NOEXCEPT {return end();} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} - _LIBCPP_INLINE_VISIBILITY + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 const_reverse_iterator crend() const _NOEXCEPT {return rend();} // capacity: @@ -188,23 +188,30 @@ _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return _Size == 0;} // element access: - _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __elems_[__n];} - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference operator[](size_type __n) const {return __elems_[__n];} - reference at(size_type __n); + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reference operator[](size_type __n) {return __elems_[__n];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 + const_reference operator[](size_type __n) const {return __elems_[__n];} + _LIBCPP_CONSTEXPR_AFTER_CXX14 reference at(size_type __n); _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const; - _LIBCPP_INLINE_VISIBILITY reference front() {return __elems_[0];} - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const {return __elems_[0];} - _LIBCPP_INLINE_VISIBILITY reference back() {return __elems_[_Size > 0 ? _Size-1 : 0];} - _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reference front() {return __elems_[0];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 + const_reference front() const {return __elems_[0];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reference back() {return __elems_[_Size > 0 ? _Size-1 : 0];} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 + const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];} _LIBCPP_INLINE_VISIBILITY - value_type* data() _NOEXCEPT {return __elems_;} + _LIBCPP_CONSTEXPR_AFTER_CXX14 value_type* data() _NOEXCEPT {return __elems_;} _LIBCPP_INLINE_VISIBILITY - const value_type* data() const _NOEXCEPT {return __elems_;} + _LIBCPP_CONSTEXPR_AFTER_CXX14 const value_type* data() const _NOEXCEPT {return __elems_;} }; template <class _Tp, size_t _Size> +_LIBCPP_CONSTEXPR_AFTER_CXX14 typename array<_Tp, _Size>::reference array<_Tp, _Size>::at(size_type __n) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits