summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/tools/qlist.h6
-rw-r--r--tests/auto/corelib/tools/qlist/tst_qlist.cpp16
2 files changed, 21 insertions, 1 deletions
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index 419e0b4966..c81968dce1 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -441,7 +441,11 @@ inline typename QList<T>::iterator QList<T>::insert(iterator before, const T &t)
Q_ASSERT_X(isValidIterator(before), "QList::insert", "The specified iterator argument 'before' is invalid");
int iBefore = int(before.i - reinterpret_cast<Node *>(p.begin()));
- Node *n = reinterpret_cast<Node *>(p.insert(iBefore));
+ Node *n = 0;
+ if (d->ref.isShared())
+ n = detach_helper_grow(iBefore, 1);
+ else
+ n = reinterpret_cast<Node *>(p.insert(iBefore));
QT_TRY {
node_construct(n, t);
} QT_CATCH(...) {
diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp
index 5ed85939ff..2c9bf9d4c9 100644
--- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp
+++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp
@@ -277,6 +277,7 @@ private slots:
void setSharableComplex_data() const;
void setSharableComplex() const;
void eraseValidIteratorsOnSharedList() const;
+ void insertWithValidIteratorsOnSharedList() const;
private:
template<typename T> void length() const;
template<typename T> void append() const;
@@ -1653,5 +1654,20 @@ void tst_QList::eraseValidIteratorsOnSharedList() const
QCOMPARE(a.at(1), 50);
}
+void tst_QList::insertWithValidIteratorsOnSharedList() const
+{
+ QList<int> a, b;
+ a.push_back(10);
+ a.push_back(20);
+ a.push_back(30);
+ QList<int>::iterator i = a.begin();
+ ++i;
+ b = a;
+ a.insert(i, 15);
+ QCOMPARE(a.size(), b.size() + 1);
+ QCOMPARE(b.at(1), 20);
+ QCOMPARE(a.at(1), 15);
+}
+
QTEST_APPLESS_MAIN(tst_QList)
#include "tst_qlist.moc"