From fe9d7bf759d116f99131d14ac8b1fb44b2bc62fd Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Thu, 25 Feb 2021 12:49:21 +0100 Subject: [PATCH] QScopedPointer: deprecate swap Follow up of 612a01be6513894ab1ec5a36b699a2142ba7f35c (deprecating QSP::take()): for the same reasons, swap() functions do not belong to QScopedPointer, or they would allow the pointer to escape: QScopedPointer a; { QScopedPointer b = ~~~; qSwap(a, b); } // b's pointer escaped its scope Deprecate them as well. [ChangeLog][QtCore][QScopedPointer] QScopedPointer swapping functions have been deprecated, as they would allow the managed pointer to escape the scope. If you need those semantics, use std::unique_ptr instead. Change-Id: I2b0938b62f2ef5a3561f61f595a3fb4c505a8f08 Reviewed-by: Allan Sandfeld Jensen Reviewed-by: Volker Hilsheimer --- src/corelib/tools/qscopedpointer.cpp | 10 +++++++++- src/corelib/tools/qscopedpointer.h | 12 ++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qscopedpointer.cpp b/src/corelib/tools/qscopedpointer.cpp index 1dd77a22dc..2f9f6f0dd4 100644 --- a/src/corelib/tools/qscopedpointer.cpp +++ b/src/corelib/tools/qscopedpointer.cpp @@ -267,6 +267,10 @@ QT_BEGIN_NAMESPACE */ /*! \fn template void QScopedPointer::swap(QScopedPointer &lhs, QScopedPointer &rhs) + + \obsolete Use std::unique_ptr instead; this function may let a pointer + escape its scope. + Swaps \a lhs with \a rhs. */ @@ -333,7 +337,11 @@ QT_BEGIN_NAMESPACE */ /*! \fn template void QScopedArrayPointer::swap(QScopedArrayPointer &other) - Swap this pointer with \a other. + + \obsolete Use std::unique_ptr instead; this function may let a pointer + escape its scope. + + Swap this pointer with \a other. */ QT_END_NAMESPACE diff --git a/src/corelib/tools/qscopedpointer.h b/src/corelib/tools/qscopedpointer.h index a4c57aab8a..5c72e7415d 100644 --- a/src/corelib/tools/qscopedpointer.h +++ b/src/corelib/tools/qscopedpointer.h @@ -169,10 +169,13 @@ public: } #endif +#if QT_DEPRECATED_SINCE(6, 2) + QT_DEPRECATED_VERSION_X_6_2("Use std::unique_ptr instead of QScopedPointer.") void swap(QScopedPointer &other) noexcept { qSwap(d, other.d); } +#endif typedef T *pointer; @@ -206,8 +209,11 @@ public: return !rhs.isNull(); } +#if QT_DEPRECATED_SINCE(6, 2) + QT_DEPRECATED_VERSION_X_6_2("Use std::unique_ptr instead of QScopedPointer.") friend void swap(QScopedPointer &p1, QScopedPointer &p2) noexcept { p1.swap(p2); } +#endif protected: T *d; @@ -240,8 +246,11 @@ public: return this->d[i]; } +#if QT_DEPRECATED_SINCE(6, 2) + QT_DEPRECATED_VERSION_X_6_2("Use std::unique_ptr instead of QScopedArrayPointer.") void swap(QScopedArrayPointer &other) noexcept // prevent QScopedPointer <->QScopedArrayPointer swaps { QScopedPointer::swap(other); } +#endif private: explicit inline QScopedArrayPointer(void *) @@ -259,9 +268,12 @@ private: Q_DISABLE_COPY(QScopedArrayPointer) }; +#if QT_DEPRECATED_SINCE(6, 2) template +QT_DEPRECATED_VERSION_X_6_2("Use std::unique_ptr instead of QScopedArrayPointer.") inline void swap(QScopedArrayPointer &lhs, QScopedArrayPointer &rhs) noexcept { lhs.swap(rhs); } +#endif QT_END_NAMESPACE