Greetings,

For google b/9650176, attached patch adds bounds checks to std::array
and updates expected line numbers in tests.

This is similar to the checks that we do for std::vector.
See also https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56109

Committed as r226465.

Thanks,
-- 
Paul Pluzhnikov
Index: libstdc++-v3/include/std/array
===================================================================
--- libstdc++-v3/include/std/array      (revision 226462)
+++ libstdc++-v3/include/std/array      (working copy)
@@ -50,7 +50,18 @@
 
       static constexpr _Tp*
       _S_ptr(const _Type& __t, std::size_t __n) noexcept
+#if __google_stl_debug_array
+      {
+       return __n < _Nm
+         ? const_cast<_Tp*>(std::__addressof(__t[__n]))
+          : (std::__throw_out_of_range_fmt(__N("array::_S_ptr: __n "
+                                           "(which is %zu) >= size() "
+                                           "(which is %zu)"),
+                                           __n, _Nm), nullptr);
+      }
+#else
       { return const_cast<_Tp*>(std::__addressof(__t[__n])); }
+#endif
     };
 
  template<typename _Tp>
Index: libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc
===================================================================
--- libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc       
(revision 226462)
+++ libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc       
(working copy)
@@ -28,6 +28,6 @@
 int n2 = std::get<1>(std::move(a));
 int n3 = std::get<1>(ca);
 
-// { dg-error "static assertion failed" "" { target *-*-* } 274 }
-// { dg-error "static assertion failed" "" { target *-*-* } 283 }
-// { dg-error "static assertion failed" "" { target *-*-* } 291 }
+// { dg-error "static assertion failed" "" { target *-*-* } 285 }
+// { dg-error "static assertion failed" "" { target *-*-* } 294 }
+// { dg-error "static assertion failed" "" { target *-*-* } 302 }
Index: 
libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc
===================================================================
--- 
libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc 
    (revision 226462)
+++ 
libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc 
    (working copy)
@@ -23,4 +23,4 @@
 
 typedef std::tuple_element<1, std::array<int, 1>>::type type;
 
-// { dg-error "static assertion failed" "" { target *-*-* } 320 }
+// { dg-error "static assertion failed" "" { target *-*-* } 331 }

Reply via email to