diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 662fede6f7b..b50cd9090f3 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -834,8 +834,11 @@ inline QList &QList::fill(parameter_type t, qsizetype newSize) // we're detached const T copy(t); d->assign(d.begin(), d.begin() + qMin(size(), newSize), t); - if (newSize > size()) + if (newSize > size()) { d->copyAppend(newSize - size(), copy); + } else if (newSize < size()) { + d->truncate(newSize); + } } return *this; } diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp index 64123c61a7f..80adb0f6a1d 100644 --- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp +++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp @@ -256,7 +256,9 @@ private slots: void fillInt() const; void fillMovable() const; void fillCustom() const; - void fillDetaches() const; + void fillDetachInt() const; + void fillDetachMovable() const; + void fillDetachCustom() const; void first() const; void fromListInt() const; void fromListMovable() const; @@ -363,6 +365,7 @@ private: template void erase(bool shared) const; template void eraseReserved() const; template void fill() const; + template void fillDetach() const; template void fromList() const; template void insert() const; template void qhash() const; @@ -1443,6 +1446,10 @@ void tst_QList::fill() const << SimpleValue::at(2) << SimpleValue::at(2) << SimpleValue::at(2) << SimpleValue::at(2) << SimpleValue::at(2) << SimpleValue::at(2)); + + // make sure it can resize to smaller size as well + myvec.fill(SimpleValue::at(3), 2); + QCOMPARE(myvec, QList() << SimpleValue::at(3) << SimpleValue::at(3)); } void tst_QList::fillInt() const @@ -1464,14 +1471,63 @@ void tst_QList::fillCustom() const QCOMPARE(instancesCount, Custom::counter.loadAcquire()); } -void tst_QList::fillDetaches() const +template +void tst_QList::fillDetach() const { - QList test = { 1, 2, 3 }; - QList copy = test; - copy.fill(42); + // detaches to the same size + { + QList original = { SimpleValue::at(1), SimpleValue::at(1), SimpleValue::at(1) }; + QList copy = original; + copy.fill(SimpleValue::at(2)); - QCOMPARE(test, QList({1, 2, 3})); - QCOMPARE(copy, QList({42, 42, 42})); + QCOMPARE(original, + QList({ SimpleValue::at(1), SimpleValue::at(1), SimpleValue::at(1) })); + QCOMPARE(copy, + QList({ SimpleValue::at(2), SimpleValue::at(2), SimpleValue::at(2) })); + } + + // detaches and grows in size + { + QList original = { SimpleValue::at(1), SimpleValue::at(1), SimpleValue::at(1) }; + QList copy = original; + copy.fill(SimpleValue::at(2), 5); + + QCOMPARE(original, + QList({ SimpleValue::at(1), SimpleValue::at(1), SimpleValue::at(1) })); + QCOMPARE(copy, + QList({ SimpleValue::at(2), SimpleValue::at(2), SimpleValue::at(2), + SimpleValue::at(2), SimpleValue::at(2) })); + } + + // detaches and shrinks in size + { + QList original = { SimpleValue::at(1), SimpleValue::at(1), SimpleValue::at(1) }; + QList copy = original; + copy.fill(SimpleValue::at(2), 1); + + QCOMPARE(original, + QList({ SimpleValue::at(1), SimpleValue::at(1), SimpleValue::at(1) })); + QCOMPARE(copy, QList({ SimpleValue::at(2) })); + } +} + +void tst_QList::fillDetachInt() const +{ + fillDetach(); +} + +void tst_QList::fillDetachMovable() const +{ + const int instancesCount = Movable::counter.loadAcquire(); + fillDetach(); + QCOMPARE(instancesCount, Movable::counter.loadAcquire()); +} + +void tst_QList::fillDetachCustom() const +{ + const int instancesCount = Custom::counter.loadAcquire(); + fillDetach(); + QCOMPARE(instancesCount, Custom::counter.loadAcquire()); } void tst_QList::first() const