summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Fanaskov <vitaly.fanaskov@qt.io>2020-04-14 12:51:14 +0200
committerVitaly Fanaskov <vitaly.fanaskov@qt.io>2020-04-23 17:09:52 +0200
commit9ba0715f08a64758453b941c4add22a269a30f71 (patch)
treefb99f735af3ed5e020317bdfb4f6866720722e43
parent23b998fa454ca021aa595f66d2e1964da4a119a4 (diff)
QFuture: the result type doesn't have to be a default-constructible
Added asserts to insure the invariant declared in the documentation. Canceled future object is not valid, hence we don't need to handle this case separately. Fixes: QTBUG-83389 Change-Id: Ib0653ef40cd3135574a91740e4ce2c6dc4da8a71 Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io> Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
-rw-r--r--src/corelib/thread/qfutureinterface.h15
-rw-r--r--tests/auto/corelib/thread/qfuture/tst_qfuture.cpp37
2 files changed, 39 insertions, 13 deletions
diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h
index 04828609ba..02f854e0de 100644
--- a/src/corelib/thread/qfutureinterface.h
+++ b/src/corelib/thread/qfutureinterface.h
@@ -339,13 +339,8 @@ inline QList<T> QFutureInterface<T>::results()
template<typename T>
T QFutureInterface<T>::takeResult()
{
- if (isCanceled()) {
- exceptionStore().throwPossibleException();
- return {};
- }
+ Q_ASSERT(isValid());
- if (!isValid())
- return {};
// Note: we wait for all, this is intentional,
// not to mess with other unready results.
waitForResult(-1);
@@ -362,13 +357,7 @@ T QFutureInterface<T>::takeResult()
template<typename T>
std::vector<T> QFutureInterface<T>::takeResults()
{
- if (isCanceled()) {
- exceptionStore().throwPossibleException();
- return {};
- }
-
- if (!isValid())
- return {};
+ Q_ASSERT(isValid());
waitForResult(-1);
std::vector<T> res;
diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
index 4784cf16db..8d4ae41fd5 100644
--- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
+++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
@@ -116,6 +116,8 @@ private slots:
void runAndTake();
void resultsReadyAt_data();
void resultsReadyAt();
+ void takeResultWorksForTypesWithoutDefaultCtor();
+ void canceledFutureIsNotValid();
private:
using size_type = std::vector<int>::size_type;
@@ -2744,5 +2746,40 @@ void tst_QFuture::resultsReadyAt()
QCOMPARE(taken, 0b1111);
}
+template <class T>
+auto makeFutureInterface(T &&result)
+{
+ QFutureInterface<T> f;
+
+ f.reportStarted();
+ f.reportResult(std::forward<T>(result));
+ f.reportFinished();
+
+ return f;
+}
+
+void tst_QFuture::takeResultWorksForTypesWithoutDefaultCtor()
+{
+ struct Foo
+ {
+ Foo() = delete;
+ explicit Foo(int i) : _i(i) {}
+
+ int _i = -1;
+ };
+
+ auto f = makeFutureInterface(Foo(42));
+
+ QCOMPARE(f.takeResult()._i, 42);
+}
+void tst_QFuture::canceledFutureIsNotValid()
+{
+ auto f = makeFutureInterface(42);
+
+ f.cancel();
+
+ QVERIFY(!f.isValid());
+}
+
QTEST_MAIN(tst_QFuture)
#include "tst_qfuture.moc"