From 3fcb0237dc718bc3605b231a1079ba9dfb5219b1 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 27 Jul 2022 14:59:35 -0700 Subject: QVariant: update the noexcept content for a few types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Commit 2f0a625fd4036b71286dfa7de4c9d795025164e7 added noexcept for these, but didn't verify that the operation itself was noexcept. And it wasn't on 32-bit systems, because sizeof(void *) is only 4 bytes, making QVariant and QVariant::Private a mere 12 bytes. That's insufficient for QUuid and for almost all geometric types when qreal==double. We can't use sizeof() in qvariant.h because most of those classes are only forward-declared. Change-Id: I6f936da6f6e84d649f70fffd1705ce948891d06a Reviewed-by: MÃ¥rten Nordheim --- src/corelib/kernel/qvariant.cpp | 27 +++++++++++++++++---------- src/corelib/kernel/qvariant.h | 35 +++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 26 deletions(-) (limited to 'src/corelib') diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index fa8bc16fb4..1b37e689f5 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -895,16 +895,22 @@ QVariant::QVariant(QLatin1StringView val) : QVariant(QString(val)) {} QVariant::QVariant(const QEasingCurve &val) : d(std::piecewise_construct_t{}, val) {} #endif #ifndef QT_NO_GEOM_VARIANT -QVariant::QVariant(QPoint pt) noexcept : d(std::piecewise_construct_t{}, pt) {} -QVariant::QVariant(QPointF pt) noexcept : d(std::piecewise_construct_t{}, pt) {} -QVariant::QVariant(QRect r) noexcept : d(std::piecewise_construct_t{}, r) {} -QVariant::QVariant(QRectF r) noexcept(sizeof(qreal) * 4 <= Private::MaxInternalSize) +QVariant::QVariant(QPoint pt) noexcept + : d(std::piecewise_construct_t{}, pt) {} +QVariant::QVariant(QPointF pt) noexcept(Private::FitsInInternalSize) + : d(std::piecewise_construct_t{}, pt) {} +QVariant::QVariant(QRect r) noexcept(Private::FitsInInternalSize) : d(std::piecewise_construct_t{}, r) {} -QVariant::QVariant(QLine l) noexcept : d(std::piecewise_construct_t{}, l) {} -QVariant::QVariant(QLineF l) noexcept(sizeof(qreal) * 4 <= Private::MaxInternalSize) +QVariant::QVariant(QRectF r) noexcept(Private::FitsInInternalSize) + : d(std::piecewise_construct_t{}, r) {} +QVariant::QVariant(QLine l) noexcept(Private::FitsInInternalSize) + : d(std::piecewise_construct_t{}, l) {} +QVariant::QVariant(QLineF l) noexcept(Private::FitsInInternalSize) : d(std::piecewise_construct_t{}, l) {} -QVariant::QVariant(QSize s) noexcept : d(std::piecewise_construct_t{}, s) {} -QVariant::QVariant(QSizeF s) noexcept : d(std::piecewise_construct_t{}, s) {} +QVariant::QVariant(QSize s) noexcept + : d(std::piecewise_construct_t{}, s) {} +QVariant::QVariant(QSizeF s) noexcept(Private::FitsInInternalSize) + : d(std::piecewise_construct_t{}, s) {} #endif #ifndef QT_BOOTSTRAPPED QVariant::QVariant(const QUrl &u) : d(std::piecewise_construct_t{}, u) {} @@ -913,7 +919,7 @@ QVariant::QVariant(const QLocale &l) : d(std::piecewise_construct_t{}, l) {} #if QT_CONFIG(regularexpression) QVariant::QVariant(const QRegularExpression &re) : d(std::piecewise_construct_t{}, re) {} #endif // QT_CONFIG(regularexpression) -QVariant::QVariant(QUuid uuid) noexcept : d(std::piecewise_construct_t{}, uuid) {} +QVariant::QVariant(QUuid uuid) noexcept(Private::FitsInInternalSize<16>) : d(std::piecewise_construct_t{}, uuid) {} #ifndef QT_BOOTSTRAPPED QVariant::QVariant(const QJsonValue &jsonValue) : d(std::piecewise_construct_t{}, jsonValue) {} QVariant::QVariant(const QJsonObject &jsonObject) : d(std::piecewise_construct_t{}, jsonObject) {} @@ -921,7 +927,8 @@ QVariant::QVariant(const QJsonArray &jsonArray) : d(std::piecewise_construct_t{} QVariant::QVariant(const QJsonDocument &jsonDocument) : d(std::piecewise_construct_t{}, jsonDocument) {} #endif // QT_BOOTSTRAPPED #if QT_CONFIG(itemmodel) -QVariant::QVariant(const QModelIndex &modelIndex) noexcept : d(std::piecewise_construct_t{}, modelIndex) {} +QVariant::QVariant(const QModelIndex &modelIndex) noexcept(Private::FitsInInternalSize<8 + 2 * sizeof(quintptr)>) + : d(std::piecewise_construct_t{}, modelIndex) {} QVariant::QVariant(const QPersistentModelIndex &modelIndex) : d(std::piecewise_construct_t{}, modelIndex) {} #endif diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index 8f14612bcc..7b45123fb6 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -73,9 +73,10 @@ public: }; struct Private { - static constexpr size_t MaxInternalSize = 3 *sizeof(void *); + static constexpr size_t MaxInternalSize = 3 * sizeof(void *); + template static constexpr bool FitsInInternalSize = S <= MaxInternalSize; template static constexpr bool CanUseInternalSpace = - (QTypeInfo::isRelocatable && sizeof(T) <= MaxInternalSize && alignof(T) <= alignof(double)); + (QTypeInfo::isRelocatable && FitsInInternalSize && alignof(T) <= alignof(double)); static constexpr bool canUseInternalSpace(const QtPrivate::QMetaTypeInterface *type) { Q_ASSERT(type); @@ -203,16 +204,10 @@ public: QVariant(bool b) noexcept; QVariant(double d) noexcept; QVariant(float f) noexcept; -#ifndef QT_NO_CAST_FROM_ASCII - QT_ASCII_CAST_WARN QVariant(const char *str) - : QVariant(QString::fromUtf8(str)) - {} -#endif QVariant(const QByteArray &bytearray) noexcept; QVariant(const QBitArray &bitarray); QVariant(const QString &string) noexcept; - QVariant(QLatin1StringView string); QVariant(const QStringList &stringlist) noexcept; QVariant(QChar qchar) noexcept; QVariant(QDate date) noexcept; @@ -223,13 +218,13 @@ public: QVariant(const QHash &hash) noexcept; #ifndef QT_NO_GEOM_VARIANT QVariant(QSize size) noexcept; - QVariant(QSizeF size) noexcept; + QVariant(QSizeF size) noexcept(Private::FitsInInternalSize); QVariant(QPoint pt) noexcept; - QVariant(QPointF pt) noexcept; - QVariant(QLine line) noexcept; - QVariant(QLineF line) noexcept(sizeof(qreal) * 4 <= Private::MaxInternalSize); - QVariant(QRect rect) noexcept; - QVariant(QRectF rect) noexcept(sizeof(qreal) * 4 <= Private::MaxInternalSize); + QVariant(QPointF pt) noexcept(Private::FitsInInternalSize); + QVariant(QLine line) noexcept(Private::FitsInInternalSize); + QVariant(QLineF line) noexcept(Private::FitsInInternalSize); + QVariant(QRect rect) noexcept(Private::FitsInInternalSize); + QVariant(QRectF rect) noexcept(Private::FitsInInternalSize); #endif QVariant(const QLocale &locale); #if QT_CONFIG(regularexpression) @@ -238,7 +233,7 @@ public: #if QT_CONFIG(easingcurve) QVariant(const QEasingCurve &easing); #endif - QVariant(QUuid uuid) noexcept; + QVariant(QUuid uuid) noexcept(Private::FitsInInternalSize<16>); #ifndef QT_BOOTSTRAPPED QVariant(const QUrl &url); QVariant(const QJsonValue &jsonValue); @@ -247,9 +242,17 @@ public: QVariant(const QJsonDocument &jsonDocument); #endif // QT_BOOTSTRAPPED #if QT_CONFIG(itemmodel) - QVariant(const QModelIndex &modelIndex) noexcept; + QVariant(const QModelIndex &modelIndex) noexcept(Private::FitsInInternalSize<8 + 2 * sizeof(quintptr)>); QVariant(const QPersistentModelIndex &modelIndex); #endif + +#ifndef QT_NO_CAST_FROM_ASCII + QT_ASCII_CAST_WARN QVariant(const char *str) noexcept(false) + : QVariant(QString::fromUtf8(str)) + {} +#endif + QVariant(QLatin1StringView string) noexcept(false); // converts to QString + #if !defined(Q_CC_GHS) // GHS has an ICE with this code; use the simplified version below template