[libcxx] r292091 - Implement the missing constexpr stuff in <array>. Fixes PR#31645.
Marshall Clow via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 15 19:02:11 PST 2017
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
}
More information about the cfe-commits
mailing list