From 20b805f30fa17272a680efb17e742148650a0f8f Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 2 Jul 2021 08:55:14 +0200 Subject: [PATCH] Fix rvalue overload of qobject_pointer_cast for GCC 9.3 The code assumed that any C++ implementation would implement the resolution for LWG2996 in C++20 mode. While that may be the case in the future, the current state in GCC 9.3 as shipped in Ubuntu 20.04 LTS is that it doesn't, which leads to tst_qsharedpointer fail there. Fix by using the safe version of std::move, std::exchange, which guarantees the state of the src object, no matter what the callee does. Change-Id: Icc39b527df4d3a7b398ff2b44bcbdf9082b81f2f Reviewed-by: Giuseppe D'Angelo (cherry picked from commit 0632494bd47e924ce7914b6457791d4612599e5f) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/tools/qsharedpointer_impl.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 994c631d76c..cc5f442d947 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -925,15 +925,11 @@ std::shared_ptr qobject_pointer_cast(std::shared_ptr &&src) using element_type = typename std::shared_ptr::element_type; auto castResult = qobject_cast(src.get()); if (castResult) { - auto result = std::shared_ptr(std::move(src), castResult); -#if __cplusplus <= 201703L // C++2a's move aliasing constructor will leave src empty. // Before C++2a we don't really know if the compiler has support for it. // The move aliasing constructor is the resolution for LWG2996, // which does not impose a feature-testing macro. So: clear src. - src.reset(); -#endif - return result; + return std::shared_ptr(std::exchange(src, nullptr), castResult); } return std::shared_ptr(); }