diff options
| author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-01-29 14:57:42 +0000 |
|---|---|---|
| committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-01-29 14:57:42 +0000 |
| commit | f29863eed95c1a1f66fa5ec63ec8cac8aa1f6585 (patch) | |
| tree | 4382950e3b74baf8bcacd9f0099feaf5da63c35e /libstdc++-v3/include/bits | |
| parent | 7deb91c75a1c9de5bf46a5c959e5e709173ee639 (diff) | |
| download | ppe42-gcc-f29863eed95c1a1f66fa5ec63ec8cac8aa1f6585.tar.gz ppe42-gcc-f29863eed95c1a1f66fa5ec63ec8cac8aa1f6585.zip | |
PR libstdc++/59829
* include/bits/stl_vector.h (vector::data()): Call _M_data_ptr.
(vector::_M_data_ptr): New overloaded functions to ensure empty
vectors do not dereference the pointer.
* testsuite/23_containers/vector/59829.cc: New.
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207241 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/bits')
| -rw-r--r-- | libstdc++-v3/include/bits/stl_vector.h | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 98ac708e8f1..7e52fde55b1 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -888,7 +888,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER pointer #endif data() _GLIBCXX_NOEXCEPT - { return std::__addressof(front()); } + { return _M_data_ptr(this->_M_impl._M_start); } #if __cplusplus >= 201103L const _Tp* @@ -896,7 +896,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER const_pointer #endif data() const _GLIBCXX_NOEXCEPT - { return std::__addressof(front()); } + { return _M_data_ptr(this->_M_impl._M_start); } // [23.2.4.3] modifiers /** @@ -1470,6 +1470,23 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER } } #endif + +#if __cplusplus >= 201103L + template<typename _Up> + _Up* + _M_data_ptr(_Up* __ptr) const + { return __ptr; } + + template<typename _Ptr> + typename std::pointer_traits<_Ptr>::element_type* + _M_data_ptr(_Ptr __ptr) const + { return empty() ? nullptr : std::__addressof(*__ptr); } +#else + template<typename _Ptr> + _Ptr + _M_data_ptr(_Ptr __ptr) const + { return __ptr; } +#endif }; |

