diff options
author | Marc Mutz <marc.mutz@qt.io> | 2022-06-10 08:07:22 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2022-06-14 01:30:48 +0000 |
commit | fa4d18b86c0cb0de495ce988fd9d3714e09b05dd (patch) | |
tree | a518e28057dc4a741221d98bfa4d2252d1276e60 /src | |
parent | 6345929115e2e44dc68581569e81c6b9b3250049 (diff) |
Revert "qxp::function_ref: drop use of q23::invoke_r"
This reverts commit b9cce12e76796962e5e5ad0d5408370af56af459, which
broke
function_ref<void(int)> f = [](int i) { return i; };
ie. swallowing of return types.
We could maybe implement the same without invoke_r, with the same
manual if-constexpr that invoke_r has, but it would be a pointless
duplication across the two thunks we have, so just use invoke_r.
Add tests.
Pick-to: 6.4
Task-number: QTBUG-103739
Change-Id: I6034f05d813c06a25e8058ded5b6b62f3ca858b4
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/global/qxpfunctional.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/corelib/global/qxpfunctional.h b/src/corelib/global/qxpfunctional.h index ca015be22e..67350c56ed 100644 --- a/src/corelib/global/qxpfunctional.h +++ b/src/corelib/global/qxpfunctional.h @@ -21,7 +21,7 @@ // We mean it. // -#include <QtCore/q20functional.h> +#include <QtCore/q23functional.h> #include <type_traits> #include <utility> @@ -99,7 +99,8 @@ public: Q_IMPLICIT function_ref_base(F* f) noexcept : m_bound_entity(f), m_thunk_ptr([](BoundEntityType ctx, ArgTypes&&... args) noexcept(noex) -> R { - return reinterpret_cast<F*>(ctx.fun)(std::forward<ArgTypes>(args)...); + return q23::invoke_r<R>(reinterpret_cast<F*>(ctx.fun), + std::forward<ArgTypes>(args)...); }) {} @@ -115,7 +116,8 @@ public: : m_bound_entity(std::addressof(f)), m_thunk_ptr([](BoundEntityType ctx, ArgTypes&&... args) noexcept(noex) -> R { using That = copy_const_t<Const, std::remove_reference_t<F>>; - return (*static_cast<That*>(ctx.obj))(std::forward<ArgTypes>(args)...); + return q23::invoke_r<R>(*static_cast<That*>(ctx.obj), + std::forward<ArgTypes>(args)...); }) {} |