summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-06-13 10:37:15 +0200
committerMarc Mutz <marc.mutz@qt.io>2023-06-20 07:34:09 +0200
commit603d6351cc32d07a5e4c349d6dc3db0889c3b120 (patch)
tree9f8c332388d3f3ec0e0cd511435d20e5a0b5b19f
parent21c344a221c1d7712a04d990958b211e2dd8a263 (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.h1
-rw-r--r--src/corelib/kernel/qproperty.h6
-rw-r--r--src/corelib/kernel/qproperty_p.h1
-rw-r--r--src/corelib/tools/qatomicscopedvaluerollback_p.h6
-rw-r--r--src/corelib/tools/qscopedpointer.h3
-rw-r--r--src/corelib/tools/qscopedvaluerollback.h2
-rw-r--r--src/corelib/tools/qscopeguard.h3
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))