summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib
diff options
context:
space:
mode:
authorAndrei Golubev <andrei.golubev@qt.io>2021-02-09 14:03:04 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-02-10 14:46:42 +0000
commitdca5a2ca39d45ec7ac1472f438328b3b941bcad1 (patch)
tree7081f9a8531f46996f12d925a1b0f92cb05d26f6 /tests/auto/corelib
parentab9032acbb6a6ffb0a4fd43eee8a4fe8bbf27ca1 (diff)
Restore pre-Qt6 QList::fill() behavior
Somehow QList::fill(t, newSize) introduced a regression in Qt6: when newSize < QList::size() we should resize to the newSize. This is aligned with QVector::fill() in 5.15 and std::vector::assign() While 6.0 is already out, picking it to 6.0.x could save someone who haven't migrated yet as well as fix some accidental bugs in Qt's code [ChangeLog][QtCore][QList] Fixed QList::fill() regression introduced in 6.0: calling fill() with size < current list size wouldn't truncate the list Fixes: QTBUG-91042 Change-Id: Ic166e2c5e42390b61df1030f7c705e344433f7f2 Reviewed-by: Lars Knoll <lars.knoll@qt.io> (cherry picked from commit 6512a7fc642c65455db770385c67cfa6d71c294c) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'tests/auto/corelib')
-rw-r--r--tests/auto/corelib/tools/qlist/tst_qlist.cpp70
1 files changed, 63 insertions, 7 deletions
diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp
index 64123c61a7..80adb0f6a1 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<typename T> void erase(bool shared) const;
template<typename T> void eraseReserved() const;
template<typename T> void fill() const;
+ template<typename T> void fillDetach() const;
template<typename T> void fromList() const;
template<typename T> void insert() const;
template<typename T> void qhash() const;
@@ -1443,6 +1446,10 @@ void tst_QList::fill() const
<< SimpleValue<T>::at(2) << SimpleValue<T>::at(2)
<< SimpleValue<T>::at(2) << SimpleValue<T>::at(2)
<< SimpleValue<T>::at(2) << SimpleValue<T>::at(2));
+
+ // make sure it can resize to smaller size as well
+ myvec.fill(SimpleValue<T>::at(3), 2);
+ QCOMPARE(myvec, QList<T>() << SimpleValue<T>::at(3) << SimpleValue<T>::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<typename T>
+void tst_QList::fillDetach() const
{
- QList<int> test = { 1, 2, 3 };
- QList<int> copy = test;
- copy.fill(42);
+ // detaches to the same size
+ {
+ QList<T> original = { SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) };
+ QList<T> copy = original;
+ copy.fill(SimpleValue<T>::at(2));
+
+ QCOMPARE(original,
+ QList<T>({ SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) }));
+ QCOMPARE(copy,
+ QList<T>({ SimpleValue<T>::at(2), SimpleValue<T>::at(2), SimpleValue<T>::at(2) }));
+ }
+
+ // detaches and grows in size
+ {
+ QList<T> original = { SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) };
+ QList<T> copy = original;
+ copy.fill(SimpleValue<T>::at(2), 5);
- QCOMPARE(test, QList<int>({1, 2, 3}));
- QCOMPARE(copy, QList<int>({42, 42, 42}));
+ QCOMPARE(original,
+ QList<T>({ SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) }));
+ QCOMPARE(copy,
+ QList<T>({ SimpleValue<T>::at(2), SimpleValue<T>::at(2), SimpleValue<T>::at(2),
+ SimpleValue<T>::at(2), SimpleValue<T>::at(2) }));
+ }
+
+ // detaches and shrinks in size
+ {
+ QList<T> original = { SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) };
+ QList<T> copy = original;
+ copy.fill(SimpleValue<T>::at(2), 1);
+
+ QCOMPARE(original,
+ QList<T>({ SimpleValue<T>::at(1), SimpleValue<T>::at(1), SimpleValue<T>::at(1) }));
+ QCOMPARE(copy, QList<T>({ SimpleValue<T>::at(2) }));
+ }
+}
+
+void tst_QList::fillDetachInt() const
+{
+ fillDetach<int>();
+}
+
+void tst_QList::fillDetachMovable() const
+{
+ const int instancesCount = Movable::counter.loadAcquire();
+ fillDetach<Movable>();
+ QCOMPARE(instancesCount, Movable::counter.loadAcquire());
+}
+
+void tst_QList::fillDetachCustom() const
+{
+ const int instancesCount = Custom::counter.loadAcquire();
+ fillDetach<Custom>();
+ QCOMPARE(instancesCount, Custom::counter.loadAcquire());
}
void tst_QList::first() const