diff --git a/src/corelib/thread/qfuture_impl.h b/src/corelib/thread/qfuture_impl.h index 9a60348e3de..58169bd05bf 100644 --- a/src/corelib/thread/qfuture_impl.h +++ b/src/corelib/thread/qfuture_impl.h @@ -592,14 +592,14 @@ void Continuation::create(F &&func, { Q_ASSERT(f); - auto continuation = [func = std::forward(func), promise = QPromise(fi), + auto continuation = [func = std::forward(func), fi, context = QPointer(context)]( const QFutureInterfaceBase &parentData) mutable { Q_ASSERT(context); const auto parent = QFutureInterface(parentData).future(); QMetaObject::invokeMethod( context, - [func = std::forward(func), promise = std::move(promise), parent]() mutable { + [func = std::forward(func), promise = QPromise(fi), parent]() mutable { SyncContinuation continuationJob( std::forward(func), parent, std::move(promise)); continuationJob.execute(); @@ -691,13 +691,13 @@ void FailureHandler::create(F &&function, QFuture(function), promise = QPromise(fi), + [function = std::forward(function), fi, context = QPointer(context)](const QFutureInterfaceBase &parentData) mutable { Q_ASSERT(context); const auto parent = QFutureInterface(parentData).future(); QMetaObject::invokeMethod(context, [function = std::forward(function), - promise = std::move(promise), parent]() mutable { + promise = QPromise(fi), parent]() mutable { FailureHandler failureHandler( std::forward(function), parent, std::move(promise)); failureHandler.run(); @@ -790,13 +790,13 @@ public: QObject *context) { Q_ASSERT(future); - auto canceledContinuation = [promise = QPromise(fi), handler = std::forward(handler), + auto canceledContinuation = [fi, handler = std::forward(handler), context = QPointer(context)]( const QFutureInterfaceBase &parentData) mutable { Q_ASSERT(context); auto parentFuture = QFutureInterface(parentData).future(); QMetaObject::invokeMethod(context, - [promise = std::move(promise), parentFuture, + [promise = QPromise(fi), parentFuture, handler = std::forward(handler)]() mutable { run(std::forward(handler), parentFuture, std::move(promise)); }); diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp index 217dfddd2fe..9234204bdcb 100644 --- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp +++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp @@ -3187,6 +3187,15 @@ void tst_QFuture::cancelContinuations() QVERIFY(watcher2.isFinished()); QVERIFY(watcher2.isCanceled()); } + + // Cancel continuations with context (QTBUG-108790) + { + // This test should pass with ASan + auto future = QtConcurrent::run([] {}); + future.then(this, [] {}); + future.waitForFinished(); + future.cancel(); + } } void tst_QFuture::continuationsWithContext()