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 /tests | |
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 'tests')
-rw-r--r-- | tests/auto/corelib/global/qxp/function_ref/tst_qxp_function_ref.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/auto/corelib/global/qxp/function_ref/tst_qxp_function_ref.cpp b/tests/auto/corelib/global/qxp/function_ref/tst_qxp_function_ref.cpp index b17ead436a..be83e76f18 100644 --- a/tests/auto/corelib/global/qxp/function_ref/tst_qxp_function_ref.cpp +++ b/tests/auto/corelib/global/qxp/function_ref/tst_qxp_function_ref.cpp @@ -42,6 +42,7 @@ private Q_SLOTS: void basics(); void constOverloads(); void constExpr(); + void voidReturning(); void ctad(); }; @@ -195,6 +196,45 @@ void v_f_i_ex(int) {} int i_f_v_ex() { return 42; } void v_f_v_ex() {} +void tst_qxp_function_ref::voidReturning() +{ + // check that "casting" int to void returns works: + + using Fi = qxp::function_ref<void(int)>; + using Fv = qxp::function_ref<void()>; + + { + Fi fi = i_f_i_nx; + fi(42); + Fv fv = i_f_v_nx; + fv(); + } + + { + Fi fi = i_f_i_ex; + fi(42); + Fv fv = i_f_v_ex; + fv(); + } + + // now with lambdas + + bool ok = false; // prevent lambdas from decaying to function pointers + { + Fi fi = [&](int i) noexcept { return i + int(ok); }; + fi(42); + Fv fv = [&]() noexcept { return int(ok); }; + fv(); + } + + { + Fi fi = [&](int i) { return i + int(ok); }; + fi(42); + Fv fv = [&]() { return int(ok); }; + fv(); + } +} + void tst_qxp_function_ref::ctad() { #define CHECK(fun, sig) \ |