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:
parent
e540d4a864
commit
3fcb0237dc
@ -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
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user