From 3d73aa660b5e1af5758ae7207ce1c05d7a0458e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Mon, 20 Jun 2022 11:07:21 +0200 Subject: function_ref test: Don't take reference of temporaries When assigning the lambdas directly to a function_ref their lifetime is limited to that of the expression. Store them on the stack first to avoid the UB. Fixes: QTBUG-104419 Pick-to: 6.4 Change-Id: I3c85ac683b0bd7768b646dc9d0a1ed4dd173e6f3 Reviewed-by: Fabian Kosmale Reviewed-by: Giuseppe D'Angelo Reviewed-by: Marc Mutz --- .../global/qxp/function_ref/tst_qxp_function_ref.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'tests/auto/corelib/global') 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 be83e76f18..6264e6a5ae 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 @@ -221,16 +221,20 @@ void tst_qxp_function_ref::voidReturning() bool ok = false; // prevent lambdas from decaying to function pointers { - Fi fi = [&](int i) noexcept { return i + int(ok); }; + auto lambda1 = [&](int i) noexcept { return i + int(ok); }; + Fi fi = lambda1; fi(42); - Fv fv = [&]() noexcept { return int(ok); }; + auto lambda2 = [&]() noexcept { return int(ok); }; + Fv fv = lambda2; fv(); } { - Fi fi = [&](int i) { return i + int(ok); }; + auto lambda1 = [&](int i) { return i + int(ok); }; + Fi fi = lambda1; fi(42); - Fv fv = [&]() { return int(ok); }; + auto lambda2 = [&]() { return int(ok); }; + Fv fv = lambda2; fv(); } } @@ -261,7 +265,8 @@ void tst_qxp_function_ref::ctad() #if 0 // no deduction guides for the non-function-pointer case, so no CTAD for lambdas { - qxp::function_ref f = [](int i) -> int { return i; }; + auto lambda = [](int i) -> int { return i; }; + qxp::function_ref f = lambda; static_assert(std::is_same_v>); } -- cgit v1.2.3