QVariant: update the noexcept content for a few types

Commit 2f0a625fd4 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 <marten.nordheim@qt.io>
This commit is contained in:
Thiago Macieira 2022-07-27 14:59:35 -07:00
parent e540d4a864
commit 3fcb0237dc
2 changed files with 36 additions and 26 deletions

View File

@ -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<sizeof(qreal) * 2>)
: d(std::piecewise_construct_t{}, pt) {}
QVariant::QVariant(QRect r) noexcept(Private::FitsInInternalSize<sizeof(int) * 4>)
: 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<sizeof(qreal) * 4>)
: d(std::piecewise_construct_t{}, r) {}
QVariant::QVariant(QLine l) noexcept(Private::FitsInInternalSize<sizeof(int) * 4>)
: 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(QLineF l) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 4>)
: d(std::piecewise_construct_t{}, l) {}
QVariant::QVariant(QSize s) noexcept
: d(std::piecewise_construct_t{}, s) {}
QVariant::QVariant(QSizeF s) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 2>)
: 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

View File

@ -73,9 +73,10 @@ public:
};
struct Private
{
static constexpr size_t MaxInternalSize = 3 *sizeof(void *);
static constexpr size_t MaxInternalSize = 3 * sizeof(void *);
template <size_t S> static constexpr bool FitsInInternalSize = S <= MaxInternalSize;
template<typename T> static constexpr bool CanUseInternalSpace =
(QTypeInfo<T>::isRelocatable && sizeof(T) <= MaxInternalSize && alignof(T) <= alignof(double));
(QTypeInfo<T>::isRelocatable && FitsInInternalSize<sizeof(T)> && 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<QString, QVariant> &hash) noexcept;
#ifndef QT_NO_GEOM_VARIANT
QVariant(QSize size) noexcept;
QVariant(QSizeF size) noexcept;
QVariant(QSizeF size) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 2>);
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<sizeof(qreal) * 2>);
QVariant(QLine line) noexcept(Private::FitsInInternalSize<sizeof(int) * 4>);
QVariant(QLineF line) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 4>);
QVariant(QRect rect) noexcept(Private::FitsInInternalSize<sizeof(int) * 4>);
QVariant(QRectF rect) noexcept(Private::FitsInInternalSize<sizeof(qreal) * 4>);
#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 <typename T,