diff options
-rw-r--r-- | src/corelib/kernel/qvariant.cpp | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qvariant.h | 9 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp | 27 |
3 files changed, 33 insertions, 5 deletions
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index cd2004680b..56e428b052 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -255,7 +255,7 @@ static void customConstruct(QVariant::Private *d, const void *copy) return; } - if (QVariant::Private::canUseInternalSpace(size, type.alignOf())) { + if (QVariant::Private::canUseInternalSpace(type)) { type.construct(&d->data, copy); d->is_shared = false; } else { diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index aa74aaa18f..012b5c52b6 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -442,9 +442,12 @@ class Q_CORE_EXPORT QVariant { static constexpr size_t MaxInternalSize = 3*sizeof(void *); template<typename T> - static constexpr bool CanUseInternalSpace = (sizeof(T) <= MaxInternalSize && alignof(T) <= alignof(double)); - static constexpr bool canUseInternalSpace(size_t s, size_t align) - { return s <= MaxInternalSize && align <= alignof(double); } + static constexpr bool CanUseInternalSpace = (QTypeInfo<T>::isRelocatable && sizeof(T) <= MaxInternalSize && alignof(T) <= alignof(double)); + static constexpr bool canUseInternalSpace(QMetaType type) + { + return type.flags() & QMetaType::RelocatableType && + size_t(type.sizeOf()) <= MaxInternalSize && size_t(type.alignOf()) <= alignof(double); + } union { diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 8860d3cabf..6da7a73851 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -284,6 +284,8 @@ private slots: void preferDirectConversionOverInterfaces(); void mutableView(); + void moveOperations(); + private: void dataStream_data(QDataStream::Version version); void loadQVariantFromDataStream(QDataStream::Version version); @@ -1926,7 +1928,7 @@ void tst_QVariant::userType() QCOMPARE(instanceCount, 3); { QVariant second = myCarrier; - QCOMPARE(instanceCount, 4); + QCOMPARE(instanceCount, 3); second.detach(); QCOMPARE(instanceCount, 4); } @@ -4961,5 +4963,28 @@ void tst_QVariant::mutableView() QCOMPARE(extracted.text, nullptr); } +void tst_QVariant::moveOperations() +{ + { + QString str = "Hello"; + auto v = QVariant::fromValue(str); + QVariant v2(std::move(v)); + QCOMPARE(v2.toString(), str); + + v = QVariant::fromValue(str); + v2 = std::move(v); + QCOMPARE(v2.toString(), str); + } + + std::list<int> list; + auto v = QVariant::fromValue(list); + QVariant v2(std::move(v)); + QVERIFY(v2.value<std::list<int>>() == list); + + v = QVariant::fromValue(list); + v2 = std::move(v); + QVERIFY(v2.value<std::list<int>>() == list); +} + QTEST_MAIN(tst_QVariant) #include "tst_qvariant.moc" |