summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qvariant.h7
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp12
2 files changed, 19 insertions, 0 deletions
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h
index 04b93c262a..907094d25c 100644
--- a/src/corelib/kernel/qvariant.h
+++ b/src/corelib/kernel/qvariant.h
@@ -53,6 +53,7 @@
#include <QtCore/qbytearraylist.h>
#endif
#include <memory>
+#include <type_traits>
#if __has_include(<variant>) && __cplusplus >= 201703L
#include <variant>
@@ -572,6 +573,12 @@ template<typename T> inline T qvariant_cast(const QVariant &v)
QMetaType targetType = QMetaType::fromType<T>();
if (v.d.type() == targetType)
return v.d.get<T>();
+ if constexpr (std::is_same_v<T,std::remove_const_t<std::remove_pointer_t<T>> const *>) {
+ using nonConstT = std::remove_const_t<std::remove_pointer_t<T>> *;
+ QMetaType nonConstTargetType = QMetaType::fromType<nonConstT>();
+ if (v.d.type() == nonConstTargetType)
+ return v.d.get<nonConstT>();
+ }
T t{};
QMetaType::convert(v.metaType(), v.constData(), targetType, &t);
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index 251bb803b4..8df3b4055b 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -169,6 +169,7 @@ private slots:
void qvariant_cast_QObject_derived();
void qvariant_cast_QObject_wrapper();
void qvariant_cast_QSharedPointerQObject();
+ void qvariant_cast_const();
void toLocale();
@@ -2579,6 +2580,17 @@ void tst_QVariant::qvariant_cast_QSharedPointerQObject()
qRegisterMetaType<QSharedPointer<QObject> >();
}
+void tst_QVariant::qvariant_cast_const()
+{
+ int i = 42;
+ QVariant v = QVariant::fromValue(&i);
+ QVariant vConst = QVariant::fromValue(const_cast<const int*>(&i));
+ QCOMPARE(v.value<int *>(), &i);
+ QCOMPARE(v.value<const int *>(), &i);
+ QCOMPARE(vConst.value<int *>(), nullptr);
+ QCOMPARE(vConst.value<const int *>(), &i);
+}
+
void tst_QVariant::convertToQUint8() const
{
/* qint8. */