[libcxx-commits] [libcxx] r356209 - Add noexcept to operator[] for array and deque. This is an extension. We already do this for string and string_view. This should give better codegen inside of noexcept functions.

Marshall Clow via libcxx-commits libcxx-commits at lists.llvm.org
Thu Mar 14 14:56:57 PDT 2019


Author: marshall
Date: Thu Mar 14 14:56:57 2019
New Revision: 356209

URL: http://llvm.org/viewvc/llvm-project?rev=356209&view=rev
Log:
Add noexcept to operator[] for array and deque. This is an extension. We already do this for string and string_view. This should give better codegen inside of noexcept functions.

Modified:
    libcxx/trunk/include/array
    libcxx/trunk/include/deque
    libcxx/trunk/test/std/containers/sequences/array/indexing.pass.cpp
    libcxx/trunk/test/std/containers/sequences/deque/deque.capacity/access.pass.cpp

Modified: libcxx/trunk/include/array
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/array?rev=356209&r1=356208&r2=356209&view=diff
==============================================================================
--- libcxx/trunk/include/array (original)
+++ libcxx/trunk/include/array Thu Mar 14 14:56:57 2019
@@ -190,9 +190,9 @@ struct _LIBCPP_TEMPLATE_VIS array
 
     // element access:
     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
-    reference operator[](size_type __n)             {return __elems_[__n];}
+    reference operator[](size_type __n)             _NOEXCEPT {return __elems_[__n];}
     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-    const_reference operator[](size_type __n) const {return __elems_[__n];}
+    const_reference operator[](size_type __n) const _NOEXCEPT {return __elems_[__n];}
 
     _LIBCPP_CONSTEXPR_AFTER_CXX14       reference at(size_type __n);
     _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const;
@@ -303,13 +303,13 @@ struct _LIBCPP_TEMPLATE_VIS array<_Tp, 0
 
     // element access:
     _LIBCPP_INLINE_VISIBILITY
-    reference operator[](size_type) {
+    reference operator[](size_type) _NOEXCEPT {
       _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array");
       _LIBCPP_UNREACHABLE();
     }
 
     _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
-    const_reference operator[](size_type) const {
+    const_reference operator[](size_type) const _NOEXCEPT {
       _LIBCPP_ASSERT(false, "cannot call array<T, 0>::operator[] on a zero-sized array");
       _LIBCPP_UNREACHABLE();
     }

Modified: libcxx/trunk/include/deque
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/deque?rev=356209&r1=356208&r2=356209&view=diff
==============================================================================
--- libcxx/trunk/include/deque (original)
+++ libcxx/trunk/include/deque Thu Mar 14 14:56:57 2019
@@ -1330,9 +1330,9 @@ public:
 
     // element access:
     _LIBCPP_INLINE_VISIBILITY
-    reference operator[](size_type __i);
+    reference operator[](size_type __i) _NOEXCEPT;
     _LIBCPP_INLINE_VISIBILITY
-    const_reference operator[](size_type __i) const;
+    const_reference operator[](size_type __i) const _NOEXCEPT;
     _LIBCPP_INLINE_VISIBILITY
     reference at(size_type __i);
     _LIBCPP_INLINE_VISIBILITY
@@ -1745,7 +1745,7 @@ deque<_Tp, _Allocator>::shrink_to_fit()
 template <class _Tp, class _Allocator>
 inline
 typename deque<_Tp, _Allocator>::reference
-deque<_Tp, _Allocator>::operator[](size_type __i)
+deque<_Tp, _Allocator>::operator[](size_type __i) _NOEXCEPT
 {
     size_type __p = __base::__start_ + __i;
     return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
@@ -1754,7 +1754,7 @@ deque<_Tp, _Allocator>::operator[](size_
 template <class _Tp, class _Allocator>
 inline
 typename deque<_Tp, _Allocator>::const_reference
-deque<_Tp, _Allocator>::operator[](size_type __i) const
+deque<_Tp, _Allocator>::operator[](size_type __i) const _NOEXCEPT
 {
     size_type __p = __base::__start_ + __i;
     return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);

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=356209&r1=356208&r2=356209&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/array/indexing.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/array/indexing.pass.cpp Thu Mar 14 14:56:57 2019
@@ -12,6 +12,7 @@
 // const_reference operator[] (size_type); // constexpr in C++14
 // reference at (size_type)
 // const_reference at (size_type); // constexpr in C++14
+// Libc++ marks these as noexcept
 
 #include <array>
 #include <cassert>
@@ -36,6 +37,8 @@ int main(int, char**)
         typedef double T;
         typedef std::array<T, 3> C;
         C c = {1, 2, 3.5};
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::reference, decltype(c[0]));
         C::reference r1 = c[0];
         assert(r1 == 1);
         r1 = 5.5;
@@ -50,6 +53,8 @@ int main(int, char**)
         typedef double T;
         typedef std::array<T, 3> C;
         const C c = {1, 2, 3.5};
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::const_reference, decltype(c[0]));
         C::const_reference r1 = c[0];
         assert(r1 == 1);
         C::const_reference r2 = c[2];
@@ -59,6 +64,8 @@ int main(int, char**)
         typedef double T;
         typedef std::array<T, 0> C;
         C c = {};
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::reference, decltype(c[0]));
         C const& cc = c;
         static_assert((std::is_same<decltype(c[0]), T &>::value), "");
         static_assert((std::is_same<decltype(cc[0]), const T &>::value), "");
@@ -73,6 +80,8 @@ int main(int, char**)
         typedef double T;
         typedef std::array<const T, 0> C;
         C c = {{}};
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::reference, decltype(c[0]));
         C const& cc = c;
         static_assert((std::is_same<decltype(c[0]), const T &>::value), "");
         static_assert((std::is_same<decltype(cc[0]), const T &>::value), "");
@@ -88,6 +97,8 @@ int main(int, char**)
         typedef double T;
         typedef std::array<T, 3> C;
         constexpr C c = {1, 2, 3.5};
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::const_reference, decltype(c[0]));
 
         constexpr T t1 = c[0];
         static_assert (t1 == 1, "");

Modified: libcxx/trunk/test/std/containers/sequences/deque/deque.capacity/access.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/deque/deque.capacity/access.pass.cpp?rev=356209&r1=356208&r2=356209&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/deque/deque.capacity/access.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/deque/deque.capacity/access.pass.cpp Thu Mar 14 14:56:57 2019
@@ -19,11 +19,13 @@
 //
 //       reference back();
 // const_reference back() const;
+// libc++ marks these as 'noexcept'
 
 #include <deque>
 #include <cassert>
 
 #include "min_allocator.h"
+#include "test_macros.h"
 
 template <class C>
 C
@@ -50,7 +52,10 @@ make(int size, int start = 0 )
 int main(int, char**)
 {
     {
-        std::deque<int> c = make<std::deque<int> >(10);
+        typedef std::deque<int> C;
+        C c = make<std::deque<int> >(10);
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::reference, decltype(c[0]));
         for (int i = 0; i < 10; ++i)
             assert(c[i] == i);
         for (int i = 0; i < 10; ++i)
@@ -59,7 +64,10 @@ int main(int, char**)
         assert(c.back() == 9);
     }
     {
-        const std::deque<int> c = make<std::deque<int> >(10);
+        typedef std::deque<int> C;
+        const C c = make<std::deque<int> >(10);
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::const_reference, decltype(c[0]));
         for (int i = 0; i < 10; ++i)
             assert(c[i] == i);
         for (int i = 0; i < 10; ++i)
@@ -69,7 +77,10 @@ int main(int, char**)
     }
 #if TEST_STD_VER >= 11
     {
-        std::deque<int, min_allocator<int>> c = make<std::deque<int, min_allocator<int>> >(10);
+        typedef std::deque<int, min_allocator<int>> C;
+        C c = make<std::deque<int, min_allocator<int>> >(10);
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::reference, decltype(c[0]));
         for (int i = 0; i < 10; ++i)
             assert(c[i] == i);
         for (int i = 0; i < 10; ++i)
@@ -78,7 +89,10 @@ int main(int, char**)
         assert(c.back() == 9);
     }
     {
-        const std::deque<int, min_allocator<int>> c = make<std::deque<int, min_allocator<int>> >(10);
+        typedef std::deque<int, min_allocator<int>> C;
+        const C c = make<std::deque<int, min_allocator<int>> >(10);
+        LIBCPP_ASSERT_NOEXCEPT(c[0]);
+        ASSERT_SAME_TYPE(C::const_reference, decltype(c[0]));
         for (int i = 0; i < 10; ++i)
             assert(c[i] == i);
         for (int i = 0; i < 10; ++i)




More information about the libcxx-commits mailing list