summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/tools/qlist/tst_qlist.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2019-11-16 23:25:26 +0100
committerLars Knoll <lars.knoll@qt.io>2020-07-06 21:29:58 +0200
commit76004502baa118016c8e0f32895af7a822f1ba37 (patch)
tree3fb524e333cb2edf6e983c4898c76f9eebb04eb4 /tests/auto/corelib/tools/qlist/tst_qlist.cpp
parent2e51686746c45055e5bb74f58e0c159bfb6a8c13 (diff)
Get rid of shared null for QByteArray, QString and QVector
As a side effect, data() can now return a nullptr. This has the potential to cause crashes in existig code. To work around this, return an empty string from QString::data() and QByteArray::data() for now. For Qt 6 (and once all our internal issues are fixed), data() will by default return a nullptr for a null QString, but we'll offer a #define to enable backwards compatible behavior. Change-Id: I4f66d97ff1dce3eb99a239f1eab9106fa9b1741a Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests/auto/corelib/tools/qlist/tst_qlist.cpp')
-rw-r--r--tests/auto/corelib/tools/qlist/tst_qlist.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp
index df3f2023d6..ddf5e9c30a 100644
--- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp
+++ b/tests/auto/corelib/tools/qlist/tst_qlist.cpp
@@ -336,6 +336,8 @@ private slots:
void emplaceWithElementFromTheSameContainer();
void emplaceWithElementFromTheSameContainer_data();
+ void fromReadOnlyData() const;
+
private:
template<typename T> void copyConstructor() const;
template<typename T> void add() const;
@@ -2830,5 +2832,53 @@ void tst_QList::emplaceConsistentWithStdVectorImpl() const
vecEq(qVec, stdVec);
}
+void tst_QList::fromReadOnlyData() const
+{
+ {
+ QVector<char> d = QVector<char>::fromReadOnlyData("ABCDEFGHIJ");
+ QCOMPARE(d.size(), 10u + 1u);
+ for (int i = 0; i < 10; ++i)
+ QCOMPARE(d.data()[i], char('A' + i));
+ }
+
+ {
+ // wchar_t is not necessarily 2-bytes
+ QVector<wchar_t> d = QVector<wchar_t>::fromReadOnlyData(L"ABCDEFGHIJ");
+ QCOMPARE(d.size(), 10u + 1u);
+ for (int i = 0; i < 10; ++i)
+ QCOMPARE(d.data()[i], wchar_t('A' + i));
+ QVERIFY(d.isDetached());
+ }
+
+ {
+ const char data[] = "ABCDEFGHIJ";
+ const QVector<char> v = QVector<char>::fromReadOnlyData(data);
+
+ QVERIFY(v.constData() == data);
+ QVERIFY(!v.isEmpty());
+ QCOMPARE(v.size(), size_t(11));
+ // v.capacity() is unspecified, for now
+
+ QCOMPARE((void*)(const char*)(v.constBegin() + v.size()), (void*)(const char*)v.constEnd());
+
+ for (int i = 0; i < 10; ++i)
+ QCOMPARE(v[i], char('A' + i));
+ QCOMPARE(v[10], char('\0'));
+ }
+
+ {
+ struct LiteralType {
+ int value;
+ Q_DECL_CONSTEXPR LiteralType(int v = 0) : value(v) {}
+ };
+ const LiteralType literal[] = {LiteralType(0), LiteralType(1), LiteralType(2)};
+
+ const QVector<LiteralType> d = QVector<LiteralType>::fromReadOnlyData(literal);
+ QCOMPARE(d.size(), 3);
+ for (int i = 0; i < 3; ++i)
+ QCOMPARE(d.data()[i].value, i);
+ }
+}
+
QTEST_MAIN(tst_QList)
#include "tst_qlist.moc"