summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/global
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2022-06-10 08:07:22 +0200
committerMarc Mutz <marc.mutz@qt.io>2022-06-14 01:30:48 +0000
commitfa4d18b86c0cb0de495ce988fd9d3714e09b05dd (patch)
treea518e28057dc4a741221d98bfa4d2252d1276e60 /tests/auto/corelib/global
parent6345929115e2e44dc68581569e81c6b9b3250049 (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/auto/corelib/global')
-rw-r--r--tests/auto/corelib/global/qxp/function_ref/tst_qxp_function_ref.cpp40
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) \