Merged to 4.0 in r292494 as requested.
On Sun, Jan 15, 2017 at 7:02 PM, Marshall Clow via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: marshall > Date: Sun Jan 15 21:02:10 2017 > New Revision: 292091 > > URL: http://llvm.org/viewvc/llvm-project?rev=292091&view=rev > Log: > Implement the missing constexpr stuff in <array>. Fixes PR#31645. > > Modified: > libcxx/trunk/include/array > libcxx/trunk/test/std/containers/sequences/array/at.pass.cpp > libcxx/trunk/test/std/containers/sequences/array/front_back.pass.cpp > libcxx/trunk/test/std/containers/sequences/array/indexing.pass.cpp > > Modified: libcxx/trunk/include/array > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/array?rev=292091&r1=292090&r2=292091&view=diff > ============================================================================== > --- libcxx/trunk/include/array (original) > +++ libcxx/trunk/include/array Sun Jan 15 21:02:10 2017 > @@ -185,14 +185,17 @@ struct _LIBCPP_TEMPLATE_VIS array > _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_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 _LIBCPP_CONSTEXPR_AFTER_CXX14 > @@ -202,6 +205,7 @@ struct _LIBCPP_TEMPLATE_VIS array > }; > > template <class _Tp, size_t _Size> > +_LIBCPP_CONSTEXPR_AFTER_CXX14 > typename array<_Tp, _Size>::reference > array<_Tp, _Size>::at(size_type __n) > { > > Modified: libcxx/trunk/test/std/containers/sequences/array/at.pass.cpp > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/array/at.pass.cpp?rev=292091&r1=292090&r2=292091&view=diff > ============================================================================== > --- libcxx/trunk/test/std/containers/sequences/array/at.pass.cpp (original) > +++ libcxx/trunk/test/std/containers/sequences/array/at.pass.cpp Sun Jan 15 > 21:02:10 2017 > @@ -23,6 +23,14 @@ > // Disable the missing braces warning for this reason. > #include "disable_missing_braces_warning.h" > > +#if TEST_STD_VER > 14 > +constexpr bool check_idx( size_t idx, double val ) > +{ > + std::array<double, 3> arr = {1, 2, 3.5}; > + return arr.at(idx) == val; > +} > +#endif > + > int main() > { > { > @@ -82,4 +90,11 @@ int main() > } > #endif > > +#if TEST_STD_VER > 14 > + { > + static_assert (check_idx(0, 1), ""); > + static_assert (check_idx(1, 2), ""); > + static_assert (check_idx(2, 3.5), ""); > + } > +#endif > } > > Modified: libcxx/trunk/test/std/containers/sequences/array/front_back.pass.cpp > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/array/front_back.pass.cpp?rev=292091&r1=292090&r2=292091&view=diff > ============================================================================== > --- libcxx/trunk/test/std/containers/sequences/array/front_back.pass.cpp > (original) > +++ libcxx/trunk/test/std/containers/sequences/array/front_back.pass.cpp Sun > Jan 15 21:02:10 2017 > @@ -9,10 +9,10 @@ > > // <array> > > -// reference front(); > -// reference back(); > +// reference front(); // constexpr in C++17 > +// reference back(); // constexpr in C++17 > // const_reference front(); // constexpr in C++14 > -// const_reference back(); // constexpr in C++14 > +// const_reference back(); // constexpr in C++14 > > #include <array> > #include <cassert> > @@ -23,6 +23,20 @@ > // Disable the missing braces warning for this reason. > #include "disable_missing_braces_warning.h" > > +#if TEST_STD_VER > 14 > +constexpr bool check_front( double val ) > +{ > + std::array<double, 3> arr = {1, 2, 3.5}; > + return arr.front() == val; > +} > + > +constexpr bool check_back( double val ) > +{ > + std::array<double, 3> arr = {1, 2, 3.5}; > + return arr.back() == val; > +} > +#endif > + > int main() > { > { > @@ -65,4 +79,10 @@ int main() > } > #endif > > +#if TEST_STD_VER > 14 > + { > + static_assert (check_front(1), ""); > + static_assert (check_back (3.5), ""); > + } > +#endif > } > > Modified: libcxx/trunk/test/std/containers/sequences/array/indexing.pass.cpp > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/array/indexing.pass.cpp?rev=292091&r1=292090&r2=292091&view=diff > ============================================================================== > --- libcxx/trunk/test/std/containers/sequences/array/indexing.pass.cpp > (original) > +++ libcxx/trunk/test/std/containers/sequences/array/indexing.pass.cpp Sun > Jan 15 21:02:10 2017 > @@ -23,6 +23,14 @@ > // Disable the missing braces warning for this reason. > #include "disable_missing_braces_warning.h" > > +#if TEST_STD_VER > 14 > +constexpr bool check_idx( size_t idx, double val ) > +{ > + std::array<double, 3> arr = {1, 2, 3.5}; > + return arr[idx] == val; > +} > +#endif > + > int main() > { > { > @@ -63,4 +71,11 @@ int main() > } > #endif > > +#if TEST_STD_VER > 14 > + { > + static_assert (check_idx(0, 1), ""); > + static_assert (check_idx(1, 2), ""); > + static_assert (check_idx(2, 3.5), ""); > + } > +#endif > } > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits