From 19874d6a6386b55fe502e3a36a9adb6813b315dc Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Mon, 31 Aug 2020 16:42:36 +0200 Subject: QVariant: Fix conversion code Fixes: QTBUG-86330 Change-Id: Ib89dcf1195e0081b4c4e2845f90c52c612e5911a Reviewed-by: Ulf Hermann --- .../auto/corelib/kernel/qvariant/tst_qvariant.cpp | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp') diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 48d68db298..8796589df3 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -221,6 +221,7 @@ private slots: void compareCustomTypes() const; void timeToDateTime() const; void copyingUserTypes() const; + void valueClassHierarchyConversion() const; void convertBoolToByteArray() const; void convertBoolToByteArray_data() const; void convertByteArrayToBool() const; @@ -2894,6 +2895,43 @@ void tst_QVariant::copyingUserTypes() const QCOMPARE(copiedType.myValue, 42); } + +struct NonQObjectBase {}; +struct NonQObjectDerived : NonQObjectBase {}; + +void tst_QVariant::valueClassHierarchyConversion() const +{ + + { + // QVariant allows downcasting + QScopedPointer derived {new CustomQObjectDerived}; + QVariant var = QVariant::fromValue(derived.get()); + CustomQObject *object = var.value(); + QVERIFY(object); + } + { + // QVariant supports upcasting to the correct dynamic type for QObjects + QScopedPointer derived {new CustomQObjectDerived}; + QVariant var = QVariant::fromValue(derived.get()); + CustomQObjectDerived *object = var.value(); + QVERIFY(object); + } + { + // QVariant forbids unsafe upcasting + QScopedPointer base {new CustomQObject}; + QVariant var = QVariant::fromValue(base.get()); + CustomQObjectDerived *object = var.value(); + QVERIFY(!object); + } + { + // QVariant does not support upcastingfor non-QObjects + QScopedPointer derived {new NonQObjectDerived}; + QVariant var = QVariant::fromValue(derived.get()); + NonQObjectDerived *object = var.value(); + QVERIFY(!object); + } +} + void tst_QVariant::convertBoolToByteArray() const { QFETCH(QByteArray, input); -- cgit v1.2.3