diff options
author | Paul Pluzhnikov <ppluzhnikov@google.com> | 2012-01-06 01:42:22 +0000 |
---|---|---|
committer | Paul Pluzhnikov <ppluzhnikov@google.com> | 2012-01-06 01:42:22 +0000 |
commit | 2e6d8b267b9ce1a459926291fd74432862adca98 (patch) | |
tree | 0e137fa6381cce8bbbaa8b55ef2e41f57faa1076 | |
parent | a566c34318fab1dc153e20d7ccd0d6a1bd9ee18d (diff) |
2012-01-05 Paul Pluzhnikov <ppluzhnikov@google.com>
Backport r178624 from google/integration.
2011-09-06 Paul Pluzhnikov <ppluzhnikov@google.com>
* include/bits/stl_vector.h (_M_is_valid): New function.
(begin, end, size, capacity, swap, clear): Call it.
* include/bits/vector.tcc (operator=): Likewise.
* libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
Adjust line numbers.
* libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
Likewise.
* libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc:
Likewise.
* libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc:
Likewise.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/google/gcc-4_6@182944 138bc75d-0d04-0410-961f-82ee72b054a4
7 files changed, 89 insertions, 11 deletions
diff --git a/libstdc++-v3/ChangeLog.google-4_6 b/libstdc++-v3/ChangeLog.google-4_6 index e89220c7f87..7164214f336 100644 --- a/libstdc++-v3/ChangeLog.google-4_6 +++ b/libstdc++-v3/ChangeLog.google-4_6 @@ -1,3 +1,22 @@ +2012-01-05 Paul Pluzhnikov <ppluzhnikov@google.com> + + Backport r178624 from google/integration. + + 2011-09-06 Paul Pluzhnikov <ppluzhnikov@google.com> + + * include/bits/stl_vector.h (_M_is_valid): New function. + (begin, end, size, capacity, swap, clear): Call it. + * include/bits/vector.tcc (operator=): Likewise. + + * libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: + Adjust line numbers. + * libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: + Likewise. + * libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc: + Likewise. + * libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc: + Likewise. + 2011-12-19 H.J. Lu <hongjiu.lu@intel.com> Jing Yu <jingyu@google.com> diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 92137b6bd6e..8b7fdb14676 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -208,6 +208,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER using _Base::_M_impl; using _Base::_M_get_Tp_allocator; + bool _M_is_valid() const + { + return (this->_M_impl._M_end_of_storage == 0 + && this->_M_impl._M_start == 0 + && this->_M_impl._M_finish == 0) + || (this->_M_impl._M_start <= this->_M_impl._M_finish + && this->_M_impl._M_finish <= this->_M_impl._M_end_of_storage + && this->_M_impl._M_start < this->_M_impl._M_end_of_storage); + } + public: // [23.2.4.1] construct/copy/destroy // (assign() and get_allocator() are also listed in this section) @@ -461,7 +471,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ iterator begin() - { return iterator(this->_M_impl._M_start); } + { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid()) + __throw_logic_error("begin() on corrupt (dangling?) vector"); +#endif + return iterator(this->_M_impl._M_start); + } /** * Returns a read-only (constant) iterator that points to the @@ -470,7 +486,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ const_iterator begin() const - { return const_iterator(this->_M_impl._M_start); } + { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid()) + __throw_logic_error("begin() on corrupt (dangling?) vector"); +#endif + return const_iterator(this->_M_impl._M_start); + } /** * Returns a read/write iterator that points one past the last @@ -479,7 +501,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ iterator end() - { return iterator(this->_M_impl._M_finish); } + { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid()) + __throw_logic_error("end() on corrupt (dangling?) vector"); +#endif + return iterator(this->_M_impl._M_finish); + } /** * Returns a read-only (constant) iterator that points one past @@ -488,7 +516,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ const_iterator end() const - { return const_iterator(this->_M_impl._M_finish); } + { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid()) + __throw_logic_error("end() on corrupt (dangling?) vector"); +#endif + return const_iterator(this->_M_impl._M_finish); + } /** * Returns a read/write reverse iterator that points to the @@ -568,7 +602,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER /** Returns the number of elements in the %vector. */ size_type size() const - { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); } + { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid()) + __throw_logic_error("size() on corrupt (dangling?) vector"); +#endif + return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); + } /** Returns the size() of the largest possible %vector. */ size_type @@ -648,7 +688,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ size_type capacity() const - { return size_type(this->_M_impl._M_end_of_storage + { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid()) + __throw_logic_error("capacity() on corrupt (dangling?) vector"); +#endif + return size_type(this->_M_impl._M_end_of_storage - this->_M_impl._M_start); } /** @@ -1034,6 +1079,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER void swap(vector& __x) { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid() || !__x._M_is_valid()) + __throw_logic_error("swap() on corrupt (dangling?) vector"); +#endif std::swap(this->_M_impl._M_start, __x._M_impl._M_start); std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); std::swap(this->_M_impl._M_end_of_storage, @@ -1053,7 +1102,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ void clear() - { _M_erase_at_end(this->_M_impl._M_start); } + { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid()) + __throw_logic_error("clear() on corrupt (dangling?) vector"); +#endif + _M_erase_at_end(this->_M_impl._M_start); + } protected: /** diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index 18148558c9a..cd23f769fc1 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -161,6 +161,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER vector<_Tp, _Alloc>:: operator=(const vector<_Tp, _Alloc>& __x) { +#if __google_stl_debug_dangling_vector + if (!this->_M_is_valid() || !__x._M_is_valid()) + __throw_logic_error("operator=() on corrupt (dangling?) vector"); +#endif if (&__x != this) { const size_type __xlen = __x.size(); diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc index 8c6a25cfe71..1985074c1d5 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1166 } +// { dg-error "no matching" "" { target *-*-* } 1221 } // { dg-excess-errors "" } #include <vector> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc index 03aa5346c69..fe242959861 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1096 } +// { dg-error "no matching" "" { target *-*-* } 1151 } // { dg-excess-errors "" } #include <vector> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc index a78e56c00a8..7616bca84c9 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1096 } +// { dg-error "no matching" "" { target *-*-* } 1151 } // { dg-excess-errors "" } #include <vector> diff --git a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc index 1c29e29d383..3ff504fe7a1 100644 --- a/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc @@ -18,7 +18,7 @@ // <http://www.gnu.org/licenses/>. // { dg-do compile } -// { dg-error "no matching" "" { target *-*-* } 1207 } +// { dg-error "no matching" "" { target *-*-* } 1262 } // { dg-excess-errors "" } #include <vector> |