[libcxx] r292091 - Implement the missing constexpr stuff in <array>. Fixes PR#31645.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 19 09:01:57 PST 2017


Merged to 4.0 in r292494 as requested.

On Sun, Jan 15, 2017 at 7:02 PM, Marshall Clow via cfe-commits
<cfe-commits at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list