diff --git a/src/corelib/tools/qlinkedlist.h b/src/corelib/tools/qlinkedlist.h index 99be770ae9b..572bdfba5d8 100644 --- a/src/corelib/tools/qlinkedlist.h +++ b/src/corelib/tools/qlinkedlist.h @@ -453,6 +453,9 @@ int QLinkedList::count(const T &t) const template typename QLinkedList::iterator QLinkedList::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 b1a9946a0f5..3fa78f5f13e 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 a, b; + a.append(5); + a.append(10); + a.append(20); + QLinkedList::iterator i = a.begin(); + ++i; + ++i; + b = a; + + QLinkedList::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"