From 6db8d0677862b1796fc9ee1e60d9a06d95ee2524 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 13 Jun 2023 09:34:12 +0200 Subject: [PATCH] Q(Shared|Weak|)Pointer: mark ctors [[nodiscard]] They're smart pointer classes, and QUIP-0019 says smart pointer class' constructors should be marked [[nodiscard]]. Task-number: QTBUG-104164 Change-Id: I86b62571e64c2579b4151ffcb03d5bb32e0ac274 Reviewed-by: Thiago Macieira Reviewed-by: Ivan Solovev (cherry picked from commit 45ffb1790c25e4fbbbaafd9ddd936ef2dd819258) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qpointer.h | 4 ++++ src/corelib/tools/qsharedpointer_impl.h | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/corelib/kernel/qpointer.h b/src/corelib/kernel/qpointer.h index 66088054efd..1914c45190a 100644 --- a/src/corelib/kernel/qpointer.h +++ b/src/corelib/kernel/qpointer.h @@ -27,15 +27,19 @@ class QPointer typename std::conditional::value, const QObject, QObject>::type; QWeakPointer wp; public: + Q_NODISCARD_CTOR QPointer() = default; + Q_NODISCARD_CTOR inline QPointer(T *p) : wp(p, true) { } // compiler-generated copy/move ctor/assignment operators are fine! // compiler-generated dtor is fine! template = true> + Q_NODISCARD_CTOR QPointer(QPointer &&other) noexcept : wp(std::exchange(other.wp, nullptr).internalData(), true) {} template = true> + Q_NODISCARD_CTOR QPointer(const QPointer &other) noexcept : wp(other.wp.internalData(), true) {} diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 9777b1a0a0d..7927a6dd2b9 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -276,23 +276,29 @@ public: T &operator*() const { return *data(); } T *operator->() const noexcept { return data(); } + Q_NODISCARD_CTOR constexpr QSharedPointer() noexcept : value(nullptr), d(nullptr) { } ~QSharedPointer() { deref(); } + Q_NODISCARD_CTOR constexpr QSharedPointer(std::nullptr_t) noexcept : value(nullptr), d(nullptr) { } template = true> + Q_NODISCARD_CTOR inline explicit QSharedPointer(X *ptr) : value(ptr) // noexcept { internalConstruct(ptr, QtSharedPointer::NormalDeleter()); } template = true> + Q_NODISCARD_CTOR inline QSharedPointer(X *ptr, Deleter deleter) : value(ptr) // throws { internalConstruct(ptr, deleter); } template + Q_NODISCARD_CTOR QSharedPointer(std::nullptr_t, Deleter deleter) : value(nullptr) { internalConstruct(static_cast(nullptr), deleter); } + Q_NODISCARD_CTOR QSharedPointer(const QSharedPointer &other) noexcept : value(other.value), d(other.d) { if (d) ref(); } QSharedPointer &operator=(const QSharedPointer &other) noexcept @@ -301,6 +307,7 @@ public: swap(copy); return *this; } + Q_NODISCARD_CTOR QSharedPointer(QSharedPointer &&other) noexcept : value(other.value), d(other.d) { @@ -310,6 +317,7 @@ public: QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QSharedPointer) template = true> + Q_NODISCARD_CTOR QSharedPointer(QSharedPointer &&other) noexcept : value(other.value), d(other.d) { @@ -326,6 +334,7 @@ public: } template = true> + Q_NODISCARD_CTOR QSharedPointer(const QSharedPointer &other) noexcept : value(other.value), d(other.d) { if (d) ref(); } @@ -338,6 +347,7 @@ public: } template = true> + Q_NODISCARD_CTOR inline QSharedPointer(const QWeakPointer &other) : value(nullptr), d(nullptr) { *this = other; } @@ -434,6 +444,7 @@ public: #undef DECLARE_COMPARE_SET private: + Q_NODISCARD_CTOR explicit QSharedPointer(Qt::Initialization) {} void deref() noexcept @@ -539,11 +550,14 @@ public: explicit operator bool() const noexcept { return !isNull(); } bool operator !() const noexcept { return isNull(); } + Q_NODISCARD_CTOR constexpr QWeakPointer() noexcept : d(nullptr), value(nullptr) { } inline ~QWeakPointer() { if (d && !d->weakref.deref()) delete d; } + Q_NODISCARD_CTOR QWeakPointer(const QWeakPointer &other) noexcept : d(other.d), value(other.value) { if (d) d->weakref.ref(); } + Q_NODISCARD_CTOR QWeakPointer(QWeakPointer &&other) noexcept : d(other.d), value(other.value) { @@ -553,6 +567,7 @@ public: QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_MOVE_AND_SWAP(QWeakPointer) template = true> + Q_NODISCARD_CTOR QWeakPointer(QWeakPointer &&other) noexcept : d(other.d), value(other.value) { @@ -581,6 +596,7 @@ public: qt_ptr_swap(this->value, other.value); } + Q_NODISCARD_CTOR inline QWeakPointer(const QSharedPointer &o) : d(o.d), value(o.data()) { if (d) d->weakref.ref();} inline QWeakPointer &operator=(const QSharedPointer &o) @@ -590,6 +606,7 @@ public: } template = true> + Q_NODISCARD_CTOR inline QWeakPointer(const QWeakPointer &o) : d(nullptr), value(nullptr) { *this = o; } @@ -603,6 +620,7 @@ public: } template = true> + Q_NODISCARD_CTOR inline QWeakPointer(const QSharedPointer &o) : d(nullptr), value(nullptr) { *this = o; } @@ -663,6 +681,7 @@ private: #ifndef QT_NO_QOBJECT template = true> + Q_NODISCARD_CTOR inline QWeakPointer(X *ptr, bool) : d(ptr ? Data::getAndRef(ptr) : nullptr), value(ptr) { } #endif