Index: include/array =================================================================== --- include/array +++ include/array @@ -37,20 +37,20 @@ void swap(array& a) noexcept(is_nothrow_swappable_v); // 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; @@ -58,18 +58,18 @@ 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 @@ -153,22 +153,22 @@ // iterators: _LIBCPP_INLINE_VISIBILITY - iterator begin() _NOEXCEPT {return iterator(__elems_);} + _LIBCPP_CONSTEXPR_AFTER_CXX14 iterator begin() _NOEXCEPT {return iterator(__elems_);} _LIBCPP_INLINE_VISIBILITY - const_iterator begin() const _NOEXCEPT {return const_iterator(__elems_);} + _LIBCPP_CONSTEXPR_AFTER_CXX14 const_iterator begin() const _NOEXCEPT {return const_iterator(__elems_);} _LIBCPP_INLINE_VISIBILITY - iterator end() _NOEXCEPT {return iterator(__elems_ + _Size);} + _LIBCPP_CONSTEXPR_AFTER_CXX14 iterator end() _NOEXCEPT {return iterator(__elems_ + _Size);} _LIBCPP_INLINE_VISIBILITY - const_iterator end() const _NOEXCEPT {return const_iterator(__elems_ + _Size);} + _LIBCPP_CONSTEXPR_AFTER_CXX14 const_iterator end() const _NOEXCEPT {return const_iterator(__elems_ + _Size);} _LIBCPP_INLINE_VISIBILITY - reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} + _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} _LIBCPP_INLINE_VISIBILITY - const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} + _LIBCPP_CONSTEXPR_AFTER_CXX14 const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} _LIBCPP_INLINE_VISIBILITY - reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} + _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} _LIBCPP_INLINE_VISIBILITY - const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} + _LIBCPP_CONSTEXPR_AFTER_CXX14 const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const _NOEXCEPT {return begin();} @@ -188,23 +188,24 @@ _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_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];} - reference at(size_type __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_CXX14 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_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_;} + value_type* _LIBCPP_CONSTEXPR_AFTER_CXX14 data() _NOEXCEPT {return __elems_;} _LIBCPP_INLINE_VISIBILITY - const value_type* data() const _NOEXCEPT {return __elems_;} + const value_type* _LIBCPP_CONSTEXPR_AFTER_CXX14 data() const _NOEXCEPT {return __elems_;} }; template +_LIBCPP_CONSTEXPR_AFTER_CXX14 typename array<_Tp, _Size>::reference array<_Tp, _Size>::at(size_type __n) { Index: include/iterator =================================================================== --- include/iterator +++ include/iterator @@ -372,25 +372,25 @@ bool failed() const noexcept; }; -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 T* begin(T (&array)[N]); -template T* end(T (&array)[N]); - -template auto cbegin(const C& c) -> decltype(std::begin(c)); // C++14 -template auto cend(const C& c) -> decltype(std::end(c)); // C++14 -template auto rbegin(C& c) -> decltype(c.rbegin()); // C++14 -template auto rbegin(const C& c) -> decltype(c.rbegin()); // C++14 -template auto rend(C& c) -> decltype(c.rend()); // C++14 -template auto rend(const C& c) -> decltype(c.rend()); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto begin(C& c) -> decltype(c.begin()); +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto begin(const C& c) -> decltype(c.begin()); +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto end(C& c) -> decltype(c.end()); +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto end(const C& c) -> decltype(c.end()); +template _LIBCPP_CONSTEXPR_AFTER_CXX14 T* begin(T (&array)[N]); +template _LIBCPP_CONSTEXPR_AFTER_CXX14 T* end(T (&array)[N]); + +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto cbegin(const C& c) -> decltype(std::begin(c)); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto cend(const C& c) -> decltype(std::end(c)); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rbegin(C& c) -> decltype(c.rbegin()); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rbegin(const C& c) -> decltype(c.rbegin()); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rend(C& c) -> decltype(c.rend()); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rend(const C& c) -> decltype(c.rend()); // C++14 template reverse_iterator rbegin(initializer_list il); // C++14 template reverse_iterator rend(initializer_list il); // C++14 -template reverse_iterator rbegin(T (&array)[N]); // C++14 -template reverse_iterator rend(T (&array)[N]); // C++14 -template auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14 -template auto crend(const C& c) -> decltype(std::rend(c)); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator rbegin(T (&array)[N]); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator rend(T (&array)[N]); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14 +template _LIBCPP_CONSTEXPR_AFTER_CXX14 auto crend(const C& c) -> decltype(std::rend(c)); // C++14 // 24.8, container access: template constexpr auto size(const C& c) -> decltype(c.size()); // C++17 @@ -1569,7 +1569,7 @@ #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN) template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto begin(_Cp& __c) -> decltype(__c.begin()) { @@ -1577,7 +1577,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto begin(const _Cp& __c) -> decltype(__c.begin()) { @@ -1585,7 +1585,7 @@ } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto end(_Cp& __c) -> decltype(__c.end()) { @@ -1593,7 +1593,7 @@ } template -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 -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 -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 -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rbegin(_Cp& __c) -> decltype(__c.rbegin()) { return __c.rbegin(); } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rbegin(const _Cp& __c) -> decltype(__c.rbegin()) { return __c.rbegin(); } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rend(_Cp& __c) -> decltype(__c.rend()) { return __c.rend(); } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto rend(const _Cp& __c) -> decltype(__c.rend()) { return __c.rend(); } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto crbegin(const _Cp& __c) -> decltype(rbegin(__c)) { return rbegin(__c); } template -inline _LIBCPP_INLINE_VISIBILITY +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 auto crend(const _Cp& __c) -> decltype(rend(__c)) { return rend(__c);