]> gcc.gnu.org Git - gcc.git/commitdiff
re PR libstdc++/61086 (ubsan detects undefined behaviour in the standard library)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 7 May 2014 14:43:22 +0000 (15:43 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 7 May 2014 14:43:22 +0000 (15:43 +0100)
PR libstdc++/61086
* include/bits/stl_iterator.h (__normal_iterator::_M_const_cast):
Remove.
* include/bits/stl_vector.h (vector::insert, vector::erase): Use
arithmetic to obtain a mutable iterator from const_iterator.
* include/bits/vector.tcc (vector::insert): Likewise.
* include/debug/vector (vector::erase): Likewise.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
Adjust dg-error line number.
* testsuite/23_containers/vector/requirements/dr438/
constructor_1_neg.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/
constructor_2_neg.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
Likewise.

From-SVN: r210162

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_iterator.h
libstdc++-v3/include/bits/stl_vector.h
libstdc++-v3/include/bits/vector.tcc
libstdc++-v3/include/debug/vector
libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc

index 62fed7d5fc12041f3fa5933099da989ec8651270..cf5d836f325277643941fc7d2b16f951f79817fc 100644 (file)
@@ -5,6 +5,22 @@
        comparison function.
        * testsuite/23_containers/set/cons/61023.cc: New.
 
+       PR libstdc++/61086
+       * include/bits/stl_iterator.h (__normal_iterator::_M_const_cast):
+       Remove.
+       * include/bits/stl_vector.h (vector::insert, vector::erase): Use
+       arithmetic to obtain a mutable iterator from const_iterator.
+       * include/bits/vector.tcc (vector::insert): Likewise.
+       * include/debug/vector (vector::erase): Likewise.
+       * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
+       Adjust dg-error line number.
+       * testsuite/23_containers/vector/requirements/dr438/
+       constructor_1_neg.cc: Likewise.
+       * testsuite/23_containers/vector/requirements/dr438/
+       constructor_2_neg.cc: Likewise.
+       * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
+       Likewise.
+
 2014-05-06  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * include/Makefile.in: Regenerate.
index 16f992c74904094c88f779f7b19bc8c20cac5037..f4522a42e72d029cc7b22bfc87c9bc124c09c43d 100644 (file)
@@ -736,21 +736,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                      _Container>::__type>& __i) _GLIBCXX_NOEXCEPT
         : _M_current(__i.base()) { }
 
-#if __cplusplus >= 201103L
-      __normal_iterator<typename _Container::pointer, _Container>
-      _M_const_cast() const noexcept
-      {
-       using _PTraits = std::pointer_traits<typename _Container::pointer>;
-       return __normal_iterator<typename _Container::pointer, _Container>
-         (_PTraits::pointer_to(const_cast<typename _PTraits::element_type&>
-                               (*_M_current)));
-      }
-#else
-      __normal_iterator
-      _M_const_cast() const
-      { return *this; }
-#endif
-
       // Forward iterator requirements
       reference
       operator*() const _GLIBCXX_NOEXCEPT
index 3d3a2cf9f8c2fcb499eea7409d690e99453d4091..0a56c65ed752c202f942cb31a1f3e361b2ddd070 100644 (file)
@@ -1051,7 +1051,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       insert(const_iterator __position, size_type __n, const value_type& __x)
       {
        difference_type __offset = __position - cbegin();
-       _M_fill_insert(__position._M_const_cast(), __n, __x);
+       _M_fill_insert(begin() + __offset, __n, __x);
        return begin() + __offset;
       }
 #else
@@ -1096,7 +1096,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
               _InputIterator __last)
         {
          difference_type __offset = __position - cbegin();
-         _M_insert_dispatch(__position._M_const_cast(),
+         _M_insert_dispatch(begin() + __offset,
                             __first, __last, __false_type());
          return begin() + __offset;
        }
@@ -1144,10 +1144,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       iterator
 #if __cplusplus >= 201103L
       erase(const_iterator __position)
+      { return _M_erase(begin() + (__position - cbegin())); }
 #else
       erase(iterator __position)
+      { return _M_erase(__position); }
 #endif
-      { return _M_erase(__position._M_const_cast()); }
 
       /**
        *  @brief  Remove a range of elements.
@@ -1170,10 +1171,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       iterator
 #if __cplusplus >= 201103L
       erase(const_iterator __first, const_iterator __last)
+      {
+       const auto __beg = begin();
+       const auto __cbeg = cbegin();
+       return _M_erase(__beg + (__first - __cbeg), __beg + (__last - __cbeg));
+      }
 #else
       erase(iterator __first, iterator __last)
+      { return _M_erase(__first, __last); }
 #endif
-      { return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
 
       /**
        *  @brief  Swaps data with another %vector.
index 299e61424986ca8a2d532e9ab838ba5016ba4b0a..5c3dfae9381c3f9c1ba1f475095ec31c2d2dfe5e 100644 (file)
@@ -121,14 +121,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       else
        {
 #if __cplusplus >= 201103L
+         const auto __pos = begin() + (__position - cbegin());
          if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
            {
              _Tp __x_copy = __x;
-             _M_insert_aux(__position._M_const_cast(), std::move(__x_copy));
+             _M_insert_aux(__pos, std::move(__x_copy));
            }
          else
+           _M_insert_aux(__pos, __x);
+#else
+           _M_insert_aux(__position, __x);
 #endif
-           _M_insert_aux(__position._M_const_cast(), __x);
        }
       return iterator(this->_M_impl._M_start + __n);
     }
@@ -307,7 +310,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
            ++this->_M_impl._M_finish;
          }
        else
-         _M_insert_aux(__position._M_const_cast(),
+         _M_insert_aux(begin() + (__position - cbegin()),
                        std::forward<_Args>(__args)...);
        return iterator(this->_M_impl._M_start + __n);
       }
index 427d19fd4a9bb04652031a7811ca97869aa0e8ad..f92a77fed112307639cf0b98ea7773dc0d34e886 100644 (file)
@@ -647,7 +647,7 @@ namespace __debug
          }
        else
 #if __cplusplus >= 201103L
-         return iterator(__first.base()._M_const_cast(), this);
+         return begin() + (__first.base() - cbegin().base());
 #else
          return __first;
 #endif
index 191fbc7bfdb3da4bc97f0d6363fddf75ef2eaaec..655c7e8ad467be4dd2972fd3079a577bb69bded2 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1320 }
+// { dg-error "no matching" "" { target *-*-* } 1326 }
 
 #include <vector>
 
index 8818a88ccd779805de42bd1099d96277b33bbaf7..d938aa21bf2a1b008f640eccb15480e216429a11 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1246 }
+// { dg-error "no matching" "" { target *-*-* } 1252 }
 
 #include <vector>
 
index 09499bcbad7a6350b3b566e9b019c24f6bd9eac7..f88828562e97acf3c31a8cce317b3248155ae30b 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1246 }
+// { dg-error "no matching" "" { target *-*-* } 1252 }
 
 #include <vector>
 #include <utility>
index 674e3b5d6e505420bb5a20b8d6fa3ce6e231dd4b..316249b01881e83afa6466603cd54ee27bb5d9c7 100644 (file)
@@ -18,7 +18,7 @@
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1361 }
+// { dg-error "no matching" "" { target *-*-* } 1367 }
 
 #include <vector>
 
This page took 0.087019 seconds and 5 git commands to generate.