From f2bcf582ddd18801ae630df53bc38899b541b74f Mon Sep 17 00:00:00 2001 From: Ivan Solovev Date: Tue, 27 Aug 2024 10:30:24 +0200 Subject: [PATCH] serialization: remove incorrect noexcept on comparison operators [1/2] QJsonValue comparison cannot be noexcept, because it might allocate, for example when calling QCborValue::toString(). As a result, all the QJsonValue(Const)Ref comparison operators also cannot be noexcept, because they convert to QJsonValue to do the comparison. QJsonObject comparison cannot be noexcept, because it might call QCborValue::makeValue(), which might allocate. QJsonArray comparison cannot be noexcept, because it might also call QCborValue::makeValue(), which might allocate. Found in 6.8 API review. Change-Id: I775746b2a76765bca26b87d5af396a8dfdfca7f9 Reviewed-by: Marc Mutz Reviewed-by: Thiago Macieira (cherry picked from commit 7f01b62969d1734832ead0547904902ae0f1b5dd) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/serialization/qjsonarray.cpp | 4 ++-- src/corelib/serialization/qjsonarray.h | 8 ++++---- src/corelib/serialization/qjsonobject.cpp | 2 +- src/corelib/serialization/qjsonobject.h | 14 ++++++-------- src/corelib/serialization/qjsonvalue.cpp | 2 +- src/corelib/serialization/qjsonvalue.h | 22 ++++++++++------------ 6 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/corelib/serialization/qjsonarray.cpp b/src/corelib/serialization/qjsonarray.cpp index 0c1b0ac7c84..6ada4e805b5 100644 --- a/src/corelib/serialization/qjsonarray.cpp +++ b/src/corelib/serialization/qjsonarray.cpp @@ -475,7 +475,7 @@ QJsonValue QJsonArray::operator[](qsizetype i) const return at(i); } -bool comparesEqual(const QJsonArray &lhs, const QJsonArray &rhs) noexcept +bool comparesEqual(const QJsonArray &lhs, const QJsonArray &rhs) { if (lhs.a == rhs.a) return true; @@ -494,7 +494,7 @@ bool comparesEqual(const QJsonArray &lhs, const QJsonArray &rhs) noexcept return true; } -bool comparesEqual(const QJsonArray &lhs, const QJsonValue &rhs) noexcept +bool comparesEqual(const QJsonArray &lhs, const QJsonValue &rhs) { return lhs == rhs.toArray(); } diff --git a/src/corelib/serialization/qjsonarray.h b/src/corelib/serialization/qjsonarray.h index 26a04e91963..4313d8ee943 100644 --- a/src/corelib/serialization/qjsonarray.h +++ b/src/corelib/serialization/qjsonarray.h @@ -302,12 +302,12 @@ private: friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QJsonArray &); friend Q_CORE_EXPORT bool comparesEqual(const QJsonArray &lhs, - const QJsonArray &rhs) noexcept; + const QJsonArray &rhs); friend Q_CORE_EXPORT bool comparesEqual(const QJsonArray &lhs, - const QJsonValue &rhs) noexcept; - Q_DECLARE_EQUALITY_COMPARABLE(QJsonArray) - Q_DECLARE_EQUALITY_COMPARABLE(QJsonArray, QJsonValue) + const QJsonValue &rhs); + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonArray) + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonArray, QJsonValue) QJsonArray(QCborContainerPrivate *array); bool detach(qsizetype reserve = 0); diff --git a/src/corelib/serialization/qjsonobject.cpp b/src/corelib/serialization/qjsonobject.cpp index 2f61de08243..12d175b8e0d 100644 --- a/src/corelib/serialization/qjsonobject.cpp +++ b/src/corelib/serialization/qjsonobject.cpp @@ -621,7 +621,7 @@ bool QJsonObject::containsImpl(T key) const Returns \c true if \a lhs object is equal to \a rhs, \c false otherwise. */ -bool comparesEqual(const QJsonObject &lhs, const QJsonObject &rhs) noexcept +bool comparesEqual(const QJsonObject &lhs, const QJsonObject &rhs) { if (lhs.o == rhs.o) return true; diff --git a/src/corelib/serialization/qjsonobject.h b/src/corelib/serialization/qjsonobject.h index 4cdbf4511d9..a0b8328b1b9 100644 --- a/src/corelib/serialization/qjsonobject.h +++ b/src/corelib/serialization/qjsonobject.h @@ -313,20 +313,18 @@ public: private: friend Q_CORE_EXPORT bool comparesEqual(const QJsonObject &lhs, - const QJsonObject &rhs) noexcept; - friend bool comparesEqual(const QJsonObject &lhs, - const QJsonValue &rhs) noexcept + const QJsonObject &rhs); + friend bool comparesEqual(const QJsonObject &lhs, const QJsonValue &rhs) { return comparesEqual(lhs, rhs.toObject()); } - friend bool comparesEqual(const QJsonObject &lhs, - const QJsonValueConstRef &rhs) noexcept + friend bool comparesEqual(const QJsonObject &lhs, const QJsonValueConstRef &rhs) { return comparesEqual(lhs, rhs.toObject()); } - Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject) - Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject, QJsonValue) - Q_DECLARE_EQUALITY_COMPARABLE(QJsonObject, QJsonValueConstRef) + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonObject) + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonObject, QJsonValue) + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonObject, QJsonValueConstRef) friend class QJsonValue; friend class QJsonDocument; friend class QJsonPrivate::Value; diff --git a/src/corelib/serialization/qjsonvalue.cpp b/src/corelib/serialization/qjsonvalue.cpp index 6c2656d89f8..09b4682bf71 100644 --- a/src/corelib/serialization/qjsonvalue.cpp +++ b/src/corelib/serialization/qjsonvalue.cpp @@ -831,7 +831,7 @@ const QJsonValue QJsonValue::operator[](qsizetype i) const Returns \c true if the \a lhs value is equal to \a rhs value, \c false otherwise. */ -bool comparesEqual(const QJsonValue &lhs, const QJsonValue &rhs) noexcept +bool comparesEqual(const QJsonValue &lhs, const QJsonValue &rhs) { if (lhs.value.type() != rhs.value.type()) { if (lhs.isDouble() && rhs.isDouble()) { diff --git a/src/corelib/serialization/qjsonvalue.h b/src/corelib/serialization/qjsonvalue.h index d71dadf837f..c04df12b4c2 100644 --- a/src/corelib/serialization/qjsonvalue.h +++ b/src/corelib/serialization/qjsonvalue.h @@ -100,8 +100,8 @@ public: private: friend Q_CORE_EXPORT bool comparesEqual(const QJsonValue &lhs, - const QJsonValue &rhs) noexcept; - Q_DECLARE_EQUALITY_COMPARABLE(QJsonValue) + const QJsonValue &rhs); + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonValue) // avoid implicit conversions from char * to bool QJsonValue(const void *) = delete; @@ -157,17 +157,17 @@ public: protected: friend bool comparesEqual(const QJsonValueConstRef &lhs, - const QJsonValueConstRef &rhs) noexcept + const QJsonValueConstRef &rhs) { return comparesEqual(concrete(lhs), concrete(rhs)); } friend bool comparesEqual(const QJsonValueConstRef &lhs, - const QJsonValue &rhs) noexcept + const QJsonValue &rhs) { return comparesEqual(concrete(lhs), rhs); } - Q_DECLARE_EQUALITY_COMPARABLE(QJsonValueConstRef) - Q_DECLARE_EQUALITY_COMPARABLE(QJsonValueConstRef, QJsonValue) + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonValueConstRef) + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonValueConstRef, QJsonValue) Q_CORE_EXPORT static QJsonValue::Type concreteType(QJsonValueConstRef self) noexcept Q_DECL_PURE_FUNCTION; @@ -280,18 +280,16 @@ public: #endif private: - friend bool comparesEqual(const QJsonValueRef &lhs, - const QJsonValueRef &rhs) noexcept + friend bool comparesEqual(const QJsonValueRef &lhs, const QJsonValueRef &rhs) { return comparesEqual(QJsonValue(lhs), QJsonValue(rhs)); } - friend bool comparesEqual(const QJsonValueRef &lhs, - const QJsonValueConstRef &rhs) noexcept + friend bool comparesEqual(const QJsonValueRef &lhs, const QJsonValueConstRef &rhs) { return comparesEqual(QJsonValue(lhs), QJsonValue(rhs)); } - Q_DECLARE_EQUALITY_COMPARABLE(QJsonValueRef) - Q_DECLARE_EQUALITY_COMPARABLE(QJsonValueRef, QJsonValueConstRef) + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonValueRef) + Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QJsonValueRef, QJsonValueConstRef) QJsonValue toValue() const; #else