Deprecate calling QList::insert/removeAt with out of bounds index

Users should not call any QList API with indices that are out of
bounds. Deprecate this behavior and make sure users get warnings
in debug mode and assertions if they disable deprecated functionality.

[ChangeLog][Important Behavior Changes] Calling QList::insert() or removeAt()
with an out of bounds index is deprecated and will not be supported in Qt 6
anymore.

Change-Id: I97adecc2e2aabd36ea2cc69e0895d625f78b32a0
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
This commit is contained in:
Lars Knoll 2019-10-04 16:53:56 +02:00
parent 746ab5f16d
commit ebf695bc77
2 changed files with 20 additions and 5 deletions

View File

@ -847,9 +847,10 @@ void **QListData::erase(void **xi)
/*! \fn template <class T> void QList<T>::insert(int i, const T &value)
Inserts \a value at index position \a i in the list. If \a i <= 0,
the value is prepended to the list. If \a i >= size(), the
value is appended to the list.
Inserts \a value at index position \a i in the list.
If \a i == 0, the value is prepended to the list. If \a i == size(),
the value is appended to the list.
Example:
\snippet code/src_corelib_tools_qlistdata.cpp 8

View File

@ -580,8 +580,16 @@ inline T &QList<T>::operator[](int i)
detach(); return reinterpret_cast<Node *>(p.at(i))->t(); }
template <typename T>
inline void QList<T>::removeAt(int i)
{ if(i >= 0 && i < p.size()) { detach();
node_destruct(reinterpret_cast<Node *>(p.at(i))); p.remove(i); } }
{
#if !QT_DEPRECATED_SINCE(5, 15)
Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::removeAt", "index out of range");
#elif !defined(QT_NO_DEBUG)
if (i < 0 || i >= p.size())
qWarning("QList::removeAt(): Index out of range.");
#endif
detach();
node_destruct(reinterpret_cast<Node *>(p.at(i))); p.remove(i);
}
template <typename T>
inline T QList<T>::takeAt(int i)
{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::take", "index out of range");
@ -676,6 +684,12 @@ inline void QList<T>::prepend(const T &t)
template <typename T>
inline void QList<T>::insert(int i, const T &t)
{
#if !QT_DEPRECATED_SINCE(5, 15)
Q_ASSERT_X(i >= 0 && i <= p.size(), "QList<T>::insert", "index out of range");
#elif !defined(QT_NO_DEBUG)
if (i < 0 || i > p.size())
qWarning("QList::insert(): Index out of range.");
#endif
if (d->ref.isShared()) {
Node *n = detach_helper_grow(i, 1);
QT_TRY {