]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/65352 (array<T,0>::begin()/end() etc. forms a null reference and...
authorJonathan Wakely <jwakely@redhat.com>
Thu, 28 May 2015 16:27:56 +0000 (17:27 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 28 May 2015 16:27:56 +0000 (17:27 +0100)
PR libstdc++/65352
* include/profile/array (array::data): Use __array_traits::_S_ptr.
* include/debug/array (array::data): Likewise.
* 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: r223842

libstdc++-v3/ChangeLog
libstdc++-v3/include/debug/array
libstdc++-v3/include/profile/array
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 1dfea0e3edbb82b297647e66c549ac719eedc56e..c6121b342fd961e2724de3c493cb8e50c96e4e3b 100644 (file)
@@ -1,5 +1,15 @@
 2015-05-28  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/65352
+       * include/profile/array (array::data): Use __array_traits::_S_ptr.
+       * include/debug/array (array::data): Likewise.
+       * 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.
+
        Backport from mainline
        2015-01-20  Jonathan Wakely  <jwakely@redhat.com>
 
index ef01c981bd425057f217c5b0fcd6d6bf38fda5c1..e8c7142db2685b2a64bcb9cca0e24157890f9a72 100644 (file)
@@ -216,11 +216,11 @@ namespace __debug
 
       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 1c38b05c56c07a46331ca58345ddcb025a6aa06f..eeea9a4d7f4b5301872e9329727c29f2a2073b44 100644 (file)
@@ -178,11 +178,11 @@ namespace __profile
 
       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 67680d61e583ae2db610e37b32c400da905cbe4e..b32f5105e634081218a4128de172006ffa1ed9fc 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 979d7f6b5aa32e56506b75a17578609350d1fe9a..0b182285ea3f1a4e37e30d89824c6272a7e9957a 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 f80798c9108fc35f063fb4fb848fbd5ce8321d63..6eeeb86f70d844a8e8d4757ed4bfeb68f837b162 100644 (file)
@@ -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 *-*-* } 328 }