diff options
-rw-r--r-- | src/corelib/tools/qlinkedlist.h | 3 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp | 19 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/corelib/tools/qlinkedlist.h b/src/corelib/tools/qlinkedlist.h index 99be770ae9..572bdfba5d 100644 --- a/src/corelib/tools/qlinkedlist.h +++ b/src/corelib/tools/qlinkedlist.h @@ -453,6 +453,9 @@ int QLinkedList<T>::count(const T &t) const template <typename T> typename QLinkedList<T>::iterator QLinkedList<T>::insert(iterator before, const T &t) { + if (d->ref.isShared()) + before = detach_helper2(before); + Node *i = before.i; Node *m = new Node(t); m->n = i; diff --git a/tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp b/tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp index b1a9946a0f..3fa78f5f13 100644 --- a/tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp +++ b/tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp @@ -47,6 +47,7 @@ class tst_QLinkedList : public QObject Q_OBJECT private slots: void eraseValidIteratorsOnSharedList() const; + void insertWithIteratorsOnSharedList() const; }; void tst_QLinkedList::eraseValidIteratorsOnSharedList() const @@ -73,5 +74,23 @@ void tst_QLinkedList::eraseValidIteratorsOnSharedList() const QCOMPARE(*r, 10); // Ensure that number 2 instance was removed; } +void tst_QLinkedList::insertWithIteratorsOnSharedList() const +{ + QLinkedList<int> a, b; + a.append(5); + a.append(10); + a.append(20); + QLinkedList<int>::iterator i = a.begin(); + ++i; + ++i; + b = a; + + QLinkedList<int>::iterator i2 = a.insert(i, 15); + QCOMPARE(b.size(), 3); + QCOMPARE(a.size(), 4); + --i2; + QCOMPARE(*i2, 10); +} + QTEST_MAIN(tst_QLinkedList) #include "tst_qlinkedlist.moc" |