diff --git a/hpx/parallel/algorithms/search.hpp b/hpx/parallel/algorithms/search.hpp index d5a3a18212ff..b3916f30d917 100644 --- a/hpx/parallel/algorithms/search.hpp +++ b/hpx/parallel/algorithms/search.hpp @@ -66,7 +66,7 @@ namespace hpx {namespace parallel { HPX_INLINE_NAMESPACE(v1) s_difference_type diff = std::distance(s_first, s_last); if (diff <= 0) - return result::get(std::move(last)); + return result::get(std::move(first)); difference_type count = std::distance(first, last); if (diff > count) diff --git a/tests/regressions/CMakeLists.txt b/tests/regressions/CMakeLists.txt index fd5e149a895e..6f5efa7d88ae 100644 --- a/tests/regressions/CMakeLists.txt +++ b/tests/regressions/CMakeLists.txt @@ -14,6 +14,7 @@ set(subdirs threads traits util + parallel ) if(HPX_HAVE_CXX11_LAMBDAS) diff --git a/tests/regressions/parallel/CMakeLists.txt b/tests/regressions/parallel/CMakeLists.txt index bc479fd3ea4a..001877b19e55 100644 --- a/tests/regressions/parallel/CMakeLists.txt +++ b/tests/regressions/parallel/CMakeLists.txt @@ -5,6 +5,7 @@ set(tests minimal_findend + search_zerolength ) foreach(test ${tests}) diff --git a/tests/regressions/parallel/search_zerolength.cpp b/tests/regressions/parallel/search_zerolength.cpp new file mode 100644 index 000000000000..eabd34c20716 --- /dev/null +++ b/tests/regressions/parallel/search_zerolength.cpp @@ -0,0 +1,50 @@ +// Copyright (c) 2015 Daniel Bourgeois +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include + +void search_zero_dist_test() +{ + using hpx::parallel::execution_policy; + using hpx::parallel::seq; + using hpx::parallel::par; + using hpx::parallel::search; + using hpx::parallel::task; + + typedef std::vector::iterator iterator; + + std::vector c(10007); + std::iota(c.begin(), c.end(), 1); + std::vector h(0); + + hpx::future fut_seq = search(seq(task), c.begin(), c.end(), + h.begin(), h.end()); + hpx::future fut_par = search(par(task), c.begin(), c.end(), + h.begin(), h.end()); + + HPX_TEST(fut_seq.get() == c.begin()); + HPX_TEST(fut_par.get() == c.begin()); +} + +int hpx_main() +{ + search_zero_dist_test(); + return hpx::finalize(); +} + +int main(int argc, char* argv[]) +{ + std::vector cfg; + cfg.push_back("hpx.os_threads=" + boost::lexical_cast + (hpx::threads::hardware_concurrency())); + + HPX_TEST_EQ_MSG(hpx::init(argc, argv, cfg), 0, + "HPX main exted with non-zero status"); + + return hpx::util::report_errors(); +}