From c1cf1e0bdf7106f5d5ebf008a74836eb0c6e59b5 Mon Sep 17 00:00:00 2001
From: Martin Karlgren <marty@roxen.com>
Date: Mon, 9 Apr 2018 23:51:32 +0200
Subject: [PATCH] Concurrent.results: Handle an empty argument array properly.

Previously code such as:

  Concurrent.Future f2 = Concurrent.results(({}));

  f2->on_success(lambda(array(string) a) { werror("success: %O.\n", a); })
    ->on_failure(lambda(mixed err) { werror (describe_backtrace(err)); });

... would lead to a backtrace because the future was destructed prematurely.
---
 lib/modules/Concurrent.pmod | 3 +++
 lib/modules/testsuite.in    | 6 ++++++
 2 files changed, 9 insertions(+)

diff --git a/lib/modules/Concurrent.pmod b/lib/modules/Concurrent.pmod
index 0a67b52e37..b924e614ba 100644
--- a/lib/modules/Concurrent.pmod
+++ b/lib/modules/Concurrent.pmod
@@ -1059,6 +1059,9 @@ variant inline Future race(Future ... futures)
 //!   @[all()], @[Promise.depend()]
 variant Future results(array(Future) futures)
 {
+  if(!sizeof(futures))
+    return resolve(({}));
+
   return Promise()->depend(futures)->future();
 }
 inline variant Future results(Future ... futures)
diff --git a/lib/modules/testsuite.in b/lib/modules/testsuite.in
index 9c1566bcde..891cafbcc9 100644
--- a/lib/modules/testsuite.in
+++ b/lib/modules/testsuite.in
@@ -379,6 +379,12 @@ test_do([[ add_constant("p12"); ]])
 test_do([[ add_constant("p13"); ]])
 exit_promise(1, ({11, 14, 12, 13}))
 
+dnl - Concurrent.results() - empty
+init_promise()
+test_do([[ add_constant("future", Concurrent.results(({}))); ]])
+init_future()
+exit_promise(1, ({}))
+
 dnl - Concurrent.traverse()
 init_promise()
 test_do([[ add_constant("p11", Concurrent.Promise()); ]])
-- 
GitLab