diff options
author | Lars Knoll <lars.knoll@qt.io> | 2019-11-16 23:25:26 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-07-06 21:29:58 +0200 |
commit | 76004502baa118016c8e0f32895af7a822f1ba37 (patch) | |
tree | 3fb524e333cb2edf6e983c4898c76f9eebb04eb4 /tests/auto/corelib/tools/qlist/tst_qlist.cpp | |
parent | 2e51686746c45055e5bb74f58e0c159bfb6a8c13 (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.cpp | 50 |
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" |