mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-22 16:37:40 +08:00
Implement the missing constexpr stuff in <array>. Fixes PR#31645.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@292091 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -185,14 +185,17 @@ struct _LIBCPP_TEMPLATE_VIS array
|
|||||||
_LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return _Size == 0;}
|
_LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT {return _Size == 0;}
|
||||||
|
|
||||||
// element access:
|
// element access:
|
||||||
_LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __elems_[__n];}
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference operator[](size_type __n) const {return __elems_[__n];}
|
reference operator[](size_type __n) {return __elems_[__n];}
|
||||||
reference at(size_type __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_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 _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_CXX11 const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||||
@@ -202,6 +205,7 @@ struct _LIBCPP_TEMPLATE_VIS array
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp, size_t _Size>
|
template <class _Tp, size_t _Size>
|
||||||
|
_LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||||
typename array<_Tp, _Size>::reference
|
typename array<_Tp, _Size>::reference
|
||||||
array<_Tp, _Size>::at(size_type __n)
|
array<_Tp, _Size>::at(size_type __n)
|
||||||
{
|
{
|
||||||
|
@@ -23,6 +23,14 @@
|
|||||||
// Disable the missing braces warning for this reason.
|
// Disable the missing braces warning for this reason.
|
||||||
#include "disable_missing_braces_warning.h"
|
#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()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -82,4 +90,11 @@ int main()
|
|||||||
}
|
}
|
||||||
#endif
|
#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
|
||||||
}
|
}
|
||||||
|
@@ -9,10 +9,10 @@
|
|||||||
|
|
||||||
// <array>
|
// <array>
|
||||||
|
|
||||||
// reference front();
|
// reference front(); // constexpr in C++17
|
||||||
// reference back();
|
// reference back(); // constexpr in C++17
|
||||||
// const_reference front(); // constexpr in C++14
|
// const_reference front(); // constexpr in C++14
|
||||||
// const_reference back(); // constexpr in C++14
|
// const_reference back(); // constexpr in C++14
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
@@ -23,6 +23,20 @@
|
|||||||
// Disable the missing braces warning for this reason.
|
// Disable the missing braces warning for this reason.
|
||||||
#include "disable_missing_braces_warning.h"
|
#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()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -65,4 +79,10 @@ int main()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if TEST_STD_VER > 14
|
||||||
|
{
|
||||||
|
static_assert (check_front(1), "");
|
||||||
|
static_assert (check_back (3.5), "");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,14 @@
|
|||||||
// Disable the missing braces warning for this reason.
|
// Disable the missing braces warning for this reason.
|
||||||
#include "disable_missing_braces_warning.h"
|
#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()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -63,4 +71,11 @@ int main()
|
|||||||
}
|
}
|
||||||
#endif
|
#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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user