summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3/include/bits
diff options
context:
space:
mode:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2014-01-29 14:57:42 +0000
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2014-01-29 14:57:42 +0000
commitf29863eed95c1a1f66fa5ec63ec8cac8aa1f6585 (patch)
tree4382950e3b74baf8bcacd9f0099feaf5da63c35e /libstdc++-v3/include/bits
parent7deb91c75a1c9de5bf46a5c959e5e709173ee639 (diff)
downloadppe42-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.h21
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
};
OpenPOWER on IntegriCloud