diff options
author | Marc Mutz <marc.mutz@qt.io> | 2023-06-13 10:37:15 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2023-06-20 07:34:09 +0200 |
commit | 603d6351cc32d07a5e4c349d6dc3db0889c3b120 (patch) | |
tree | 9f8c332388d3f3ec0e0cd511435d20e5a0b5b19f | |
parent | 21c344a221c1d7712a04d990958b211e2dd8a263 (diff) |
Mark all ctors of [[nodiscard]] classes as Q_NODISCARD_CTOR
This works around around the difference in class-level [[nodiscard]]
behavior between Clang and GCC. While Clang already warns about
QClass(~~~args~~~);
when QClass is marked as [[nodiscard]] at the class level, GCC does
not, and requires the ctor to be marked as [[nodiscard]] instead.
Pick-to: 6.6
Fixes: QTBUG-104164
Change-Id: Ifd7076ee422fb9472ae8bbba43d9bfeee1968a78
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r-- | src/corelib/io/qfile.h | 1 | ||||
-rw-r--r-- | src/corelib/kernel/qproperty.h | 6 | ||||
-rw-r--r-- | src/corelib/kernel/qproperty_p.h | 1 | ||||
-rw-r--r-- | src/corelib/tools/qatomicscopedvaluerollback_p.h | 6 | ||||
-rw-r--r-- | src/corelib/tools/qscopedpointer.h | 3 | ||||
-rw-r--r-- | src/corelib/tools/qscopedvaluerollback.h | 2 | ||||
-rw-r--r-- | src/corelib/tools/qscopeguard.h | 3 |
7 files changed, 22 insertions, 0 deletions
diff --git a/src/corelib/io/qfile.h b/src/corelib/io/qfile.h index cb06665a9f..1153ba7686 100644 --- a/src/corelib/io/qfile.h +++ b/src/corelib/io/qfile.h @@ -41,6 +41,7 @@ class [[nodiscard]] QNtfsPermissionCheckGuard { Q_DISABLE_COPY_MOVE(QNtfsPermissionCheckGuard) public: + Q_NODISCARD_CTOR QNtfsPermissionCheckGuard() { qEnableNtfsPermissionChecks(); diff --git a/src/corelib/kernel/qproperty.h b/src/corelib/kernel/qproperty.h index e45d532fb9..3ed977d16e 100644 --- a/src/corelib/kernel/qproperty.h +++ b/src/corelib/kernel/qproperty.h @@ -57,6 +57,7 @@ class [[nodiscard]] QScopedPropertyUpdateGroup { Q_DISABLE_COPY_MOVE(QScopedPropertyUpdateGroup) public: + Q_NODISCARD_CTOR QScopedPropertyUpdateGroup() { Qt::beginPropertyUpdateGroup(); } ~QScopedPropertyUpdateGroup() noexcept(false) @@ -290,6 +291,7 @@ class [[nodiscard]] QPropertyChangeHandler : public QPropertyObserver { Functor m_handler; public: + Q_NODISCARD_CTOR QPropertyChangeHandler(Functor handler) : QPropertyObserver([](QPropertyObserver *self, QUntypedPropertyData *) { auto This = static_cast<QPropertyChangeHandler<Functor>*>(self); @@ -300,6 +302,7 @@ public: } template<typename Property, typename = typename Property::InheritsQUntypedPropertyData> + Q_NODISCARD_CTOR QPropertyChangeHandler(const Property &property, Functor handler) : QPropertyObserver([](QPropertyObserver *self, QUntypedPropertyData *) { auto This = static_cast<QPropertyChangeHandler<Functor>*>(self); @@ -315,8 +318,10 @@ class [[nodiscard]] QPropertyNotifier : public QPropertyObserver { std::function<void()> m_handler; public: + Q_NODISCARD_CTOR QPropertyNotifier() = default; template<typename Functor> + Q_NODISCARD_CTOR QPropertyNotifier(Functor handler) : QPropertyObserver([](QPropertyObserver *self, QUntypedPropertyData *) { auto This = static_cast<QPropertyNotifier *>(self); @@ -327,6 +332,7 @@ public: } template<typename Functor, typename Property, typename = typename Property::InheritsQUntypedPropertyData> + Q_NODISCARD_CTOR QPropertyNotifier(const Property &property, Functor handler) : QPropertyObserver([](QPropertyObserver *self, QUntypedPropertyData *) { auto This = static_cast<QPropertyNotifier *>(self); diff --git a/src/corelib/kernel/qproperty_p.h b/src/corelib/kernel/qproperty_p.h index 5b1d0eb273..9946482d7f 100644 --- a/src/corelib/kernel/qproperty_p.h +++ b/src/corelib/kernel/qproperty_p.h @@ -99,6 +99,7 @@ struct [[nodiscard]] QPropertyObserverNodeProtector Q_DISABLE_COPY_MOVE(QPropertyObserverNodeProtector) QPropertyObserverBase m_placeHolder; + Q_NODISCARD_CTOR QPropertyObserverNodeProtector(QPropertyObserver *observer) { // insert m_placeholder after observer into the linked list diff --git a/src/corelib/tools/qatomicscopedvaluerollback_p.h b/src/corelib/tools/qatomicscopedvaluerollback_p.h index 147156d585..e70889c288 100644 --- a/src/corelib/tools/qatomicscopedvaluerollback_p.h +++ b/src/corelib/tools/qatomicscopedvaluerollback_p.h @@ -52,11 +52,13 @@ public: // // std::atomic: // + Q_NODISCARD_CTOR explicit constexpr QAtomicScopedValueRollback(std::atomic<T> &var, std::memory_order mo = std::memory_order_seq_cst) : m_atomic(var), m_value(var.load(mo)), m_mo(mo) {} + Q_NODISCARD_CTOR explicit constexpr QAtomicScopedValueRollback(std::atomic<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst) @@ -65,11 +67,13 @@ public: // // Q(Basic)AtomicInteger: // + Q_NODISCARD_CTOR explicit constexpr QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, std::memory_order mo = std::memory_order_seq_cst) : QAtomicScopedValueRollback(var._q_value, mo) {} + Q_NODISCARD_CTOR explicit constexpr QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value, std::memory_order mo = std::memory_order_seq_cst) @@ -78,11 +82,13 @@ public: // // Q(Basic)AtomicPointer: // + Q_NODISCARD_CTOR explicit constexpr QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, std::memory_order mo = std::memory_order_seq_cst) : QAtomicScopedValueRollback(var._q_value, mo) {} + Q_NODISCARD_CTOR explicit constexpr QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, T value, std::memory_order mo = std::memory_order_seq_cst) diff --git a/src/corelib/tools/qscopedpointer.h b/src/corelib/tools/qscopedpointer.h index 2f86d45050..59bae9b967 100644 --- a/src/corelib/tools/qscopedpointer.h +++ b/src/corelib/tools/qscopedpointer.h @@ -70,6 +70,7 @@ template <typename T, typename Cleanup = QScopedPointerDeleter<T> > class QScopedPointer { public: + Q_NODISCARD_CTOR explicit QScopedPointer(T *p = nullptr) noexcept : d(p) { } @@ -192,10 +193,12 @@ class QScopedArrayPointer : public QScopedPointer<T, Cleanup> template <typename Ptr> using if_same_type = typename std::enable_if<std::is_same<typename std::remove_cv<T>::type, Ptr>::value, bool>::type; public: + Q_NODISCARD_CTOR inline QScopedArrayPointer() : QScopedPointer<T, Cleanup>(nullptr) {} inline ~QScopedArrayPointer() = default; template <typename D, if_same_type<D> = true> + Q_NODISCARD_CTOR explicit QScopedArrayPointer(D *p) : QScopedPointer<T, Cleanup>(p) { diff --git a/src/corelib/tools/qscopedvaluerollback.h b/src/corelib/tools/qscopedvaluerollback.h index 53a31e4675..6e724886f4 100644 --- a/src/corelib/tools/qscopedvaluerollback.h +++ b/src/corelib/tools/qscopedvaluerollback.h @@ -12,11 +12,13 @@ template <typename T> class [[nodiscard]] QScopedValueRollback { public: + Q_NODISCARD_CTOR explicit constexpr QScopedValueRollback(T &var) : varRef(var), oldValue(var) { } + Q_NODISCARD_CTOR explicit constexpr QScopedValueRollback(T &var, T value) : varRef(var), oldValue(std::move(var)) // ### C++20: std::exchange(var, std::move(value)) { diff --git a/src/corelib/tools/qscopeguard.h b/src/corelib/tools/qscopeguard.h index 5bd202ce33..0d756ebbd9 100644 --- a/src/corelib/tools/qscopeguard.h +++ b/src/corelib/tools/qscopeguard.h @@ -16,16 +16,19 @@ template <typename F> class [[nodiscard]] QScopeGuard { public: + Q_NODISCARD_CTOR explicit QScopeGuard(F &&f) noexcept : m_func(std::move(f)) { } + Q_NODISCARD_CTOR explicit QScopeGuard(const F &f) noexcept : m_func(f) { } + Q_NODISCARD_CTOR QScopeGuard(QScopeGuard &&other) noexcept : m_func(std::move(other.m_func)) , m_invoke(std::exchange(other.m_invoke, false)) |