From 708e4ea23561e28f4032a74eda7e74998087acf2 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Mon, 25 Jul 2022 09:37:19 +0200 Subject: [PATCH] QVariant: prepare removal of nullptr_t special casing in Qt 7 customConstruct has to do an additional check to ensure that QVariant::fromValue(nullptr) returns null. We can get rid of it by special casing nullptr_t in a fromValue overload instead, reducing the amount of work that needs to happen at runtime. Change-Id: I2aea6aecfee0a9404cbd78dbea01a1d5d3047ca0 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qvariant.cpp | 3 ++- src/corelib/kernel/qvariant.h | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 61ea0dd8e7..aee2e757db 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -250,7 +250,8 @@ static void customConstruct(const QtPrivate::QMetaTypeInterface *iface, QVariant // need to check for nullptr_t here, as this can get called by fromValue(nullptr). fromValue() uses // std::addressof(value) which in this case returns the address of the nullptr object. - d->is_null = !copy || isInterfaceFor(iface); + // ### Qt 7: remove nullptr_t special casing + d->is_null = !copy QT6_ONLY(|| isInterfaceFor(iface)); void *dst; if (QVariant::Private::canUseInternalSpace(iface)) { diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index 73b7e97792..8f14612bcc 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -435,6 +435,8 @@ public: static inline QVariant fromValue(const T &value) #endif { + if constexpr (std::is_null_pointer_v) + return QVariant(QMetaType::fromType()); return QVariant(QMetaType::fromType(), std::addressof(value)); }