diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-16 12:38:27 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-19 16:29:49 +0200 |
commit | 28df51caff7ad68b49c1af14e5907828cb97e937 (patch) | |
tree | ff955702ab0980acb5878ae569bb8e9044da5367 /src | |
parent | 91ab8c173d952e59f45f679a1a27d88b8606afd5 (diff) |
Add noexcept to d-ptr accessor functions
In theory this could be source incompatible with Q_DECLARE_PRIVATE
on a QSharedDataPointer, but that would both be a misuse, and all places
where something like that could have been used in Qt, Q_DECLARE_PRIVATE
is already manually inlined.
Change-Id: I60bdde3a71646129cef84f31624d0432e7af91ab
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/global/qglobal.h | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 44f21e2b1b..6d8f1e8269 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -1111,28 +1111,29 @@ for (auto _container_ = QtPrivate::qMakeForeachContainer(container); \ # endif #endif -template <typename T> inline T *qGetPtrHelper(T *ptr) { return ptr; } -template <typename Ptr> inline auto qGetPtrHelper(Ptr &ptr) -> decltype(ptr.get()) { return ptr.get(); } +template <typename T> inline T *qGetPtrHelper(T *ptr) noexcept { return ptr; } +template <typename Ptr> inline auto qGetPtrHelper(Ptr &ptr) noexcept -> decltype(ptr.get()) +{ static_assert(noexcept(ptr.get()), "Smart d pointers for Q_DECLARE_PRIVATE must have noexcept get()"); return ptr.get(); } // The body must be a statement: #define Q_CAST_IGNORE_ALIGN(body) QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wcast-align") body QT_WARNING_POP #define Q_DECLARE_PRIVATE(Class) \ - inline Class##Private* d_func() \ + inline Class##Private* d_func() noexcept \ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr));) } \ - inline const Class##Private* d_func() const \ + inline const Class##Private* d_func() const noexcept \ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr));) } \ friend class Class##Private; #define Q_DECLARE_PRIVATE_D(Dptr, Class) \ - inline Class##Private* d_func() \ + inline Class##Private* d_func() noexcept \ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(Dptr));) } \ - inline const Class##Private* d_func() const \ + inline const Class##Private* d_func() const noexcept \ { Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(Dptr));) } \ friend class Class##Private; #define Q_DECLARE_PUBLIC(Class) \ - inline Class* q_func() { return static_cast<Class *>(q_ptr); } \ - inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \ + inline Class* q_func() noexcept { return static_cast<Class *>(q_ptr); } \ + inline const Class* q_func() const noexcept { return static_cast<const Class *>(q_ptr); } \ friend class Class; #define Q_D(Class) Class##Private * const d = d_func() |