re PR libstdc++/65352 (array<T,0>::begin()/end() etc. forms a null reference and...
authorJonathan Wakely <jwakely@redhat.com>
Thu, 28 May 2015 11:53:35 +0000 (12:53 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 28 May 2015 11:53:35 +0000 (12:53 +0100)
PR libstdc++/65352
* include/std/array (__array_traits::_S_ptr): New function.
(array::data): Use _S_ptr to avoid creating invalid reference.
* testsuite/23_containers/array/tuple_interface/get_neg.cc: Adjust
dg-error line numbers.
* testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc:
likewise.

From-SVN: r223806

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/array
libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc
libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc

index cadee8312b4b7563adb72497f68292cf88a29722..aea089adef8f97cdc732a2609312d893af956263 100644 (file)
@@ -1,3 +1,13 @@
+2015-05-28  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/65352
+       * include/std/array (__array_traits::_S_ptr): New function.
+       (array::data): Use _S_ptr to avoid creating invalid reference.
+       * testsuite/23_containers/array/tuple_interface/get_neg.cc: Adjust
+       dg-error line numbers.
+       * testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc:
+       likewise.
+
 2015-05-27  Jonathan Wakely  <jwakely@redhat.com>
 
        * include/bits/stl_tree.h (_Rb_tree::_M_end()): Return _Base_ptr
index 429506b3850972e1327cf75a4892b1830f6b7878..24be44f5b134c61b22552aa89fde311484ad2d02 100644 (file)
@@ -51,6 +51,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       static constexpr _Tp&
       _S_ref(const _Type& __t, std::size_t __n) noexcept
       { return const_cast<_Tp&>(__t[__n]); }
+
+      static constexpr _Tp*
+      _S_ptr(const _Type& __t) noexcept
+      { return const_cast<_Tp*>(__t); }
     };
 
  template<typename _Tp>
@@ -61,6 +65,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
      static constexpr _Tp&
      _S_ref(const _Type&, std::size_t) noexcept
      { return *static_cast<_Tp*>(nullptr); }
+
+     static constexpr _Tp*
+     _S_ptr(const _Type&) noexcept
+     { return nullptr; }
    };
 
   /**
@@ -219,11 +227,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
       pointer
       data() noexcept
-      { return std::__addressof(_AT_Type::_S_ref(_M_elems, 0)); }
+      { return _AT_Type::_S_ptr(_M_elems); }
 
       const_pointer
       data() const noexcept
-      { return std::__addressof(_AT_Type::_S_ref(_M_elems, 0)); }
+      { return _AT_Type::_S_ptr(_M_elems); }
     };
 
   // Array comparisons.
index 76044125fa3172b86e718d5df807afd87ba896ee..68309645317741c391a3703746a88d8632db735c 100644 (file)
@@ -28,6 +28,6 @@ int n1 = std::get<1>(a);
 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 *-*-* } 282 }
 // { dg-error "static assertion failed" "" { target *-*-* } 291 }
+// { dg-error "static assertion failed" "" { target *-*-* } 299 }
index 9788053a9b1a6d4e53c0447be8373ec5fef92d11..5d75366611c654a48f422416601059adb052ac90 100644 (file)
@@ -23,4 +23,4 @@
 
 typedef std::tuple_element<1, std::array<int, 1>>::type type;
 
-// { dg-error "static assertion failed" "" { target *-*-* } 322 }
+// { dg-error "static assertion failed" "" { target *-*-* } 330 }