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. Pick-to: 6.2 6.1 5.15 Change-Id: Icc39b527df4d3a7b398ff2b44bcbdf9082b81f2f Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>bb10
parent
d492245d9f
commit
0632494bd4
|
|
@ -931,15 +931,11 @@ std::shared_ptr<X> qobject_pointer_cast(std::shared_ptr<T> &&src)
|
|||
using element_type = typename std::shared_ptr<X>::element_type;
|
||||
auto castResult = qobject_cast<element_type *>(src.get());
|
||||
if (castResult) {
|
||||
auto result = std::shared_ptr<X>(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<X>(std::exchange(src, nullptr), castResult);
|
||||
}
|
||||
return std::shared_ptr<X>();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue