diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2022-07-22 09:11:16 -0700 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-09-16 14:55:12 +0000 |
commit | a4aeb081769cd0f5817c8e84b4740f315aa3b673 (patch) | |
tree | bfe633d3e2ebe529f374cf33941514e099a3b052 /tests/auto/corelib | |
parent | 65ccd8c22d08d088ccb96c695c8e607932b701f7 (diff) |
QVariant: do allow non-default-constructible types
So long as you only ask us to copy it. Copying is mandatory, though.
I'll firm up the warning in a later commit, which may not get cherry-
picked as far back.
Fixes: QTBUG-105140
Change-Id: I3859764fed084846bcb0fffd170432abf65dc197
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit df0085d3a28005e84eb7688cc2575a121ba322aa)
Diffstat (limited to 'tests/auto/corelib')
-rw-r--r-- | tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 52412206a2..9fe7115d63 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -314,6 +314,7 @@ private slots: void constructFromIncompatibleMetaType_data(); void constructFromIncompatibleMetaType(); + void copyNonDefaultConstructible(); private: void dataStream_data(QDataStream::Version version); @@ -5140,11 +5141,19 @@ void tst_QVariant::equalsWithoutMetaObject() QVERIFY(qobjectVariant != noMetaObjectVariant); } -class NonDefaultConstructible +struct NonDefaultConstructible { - NonDefaultConstructible(int ) {} + NonDefaultConstructible(int i) :i(i) {} + int i; + friend bool operator==(NonDefaultConstructible l, NonDefaultConstructible r) + { return l.i == r.i; } }; +template <> char *QTest::toString<NonDefaultConstructible>(const NonDefaultConstructible &ndc) +{ + return qstrdup('{' + QByteArray::number(ndc.i) + '}'); +} + struct Indestructible { Indestructible() {} @@ -5184,5 +5193,23 @@ void tst_QVariant::constructFromIncompatibleMetaType() QVERIFY(!QVariant(regular).convert(type)); } +void tst_QVariant::copyNonDefaultConstructible() +{ + NonDefaultConstructible ndc(42); + QVariant var(QMetaType::fromType<NonDefaultConstructible>(), &ndc); + QVERIFY(var.isDetached()); + QCOMPARE(var.metaType(), QMetaType::fromType<NonDefaultConstructible>()); + QVERIFY(var.constData() != &ndc); + + // qvariant_cast<T> and QVariant::value<T> don't compile + QCOMPARE(*static_cast<const NonDefaultConstructible *>(var.constData()), ndc); + + QVariant var2 = var; + var2.detach(); // force another copy + QVERIFY(var2.isDetached()); + QVERIFY(var2.constData() != var.constData()); + QCOMPARE(var2, var); +} + QTEST_MAIN(tst_QVariant) #include "tst_qvariant.moc" |