summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qvariant.cpp2
-rw-r--r--src/corelib/kernel/qvariant.h9
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp27
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"