From 870d5eb77665553f1800045877b1a4d577657bff Mon Sep 17 00:00:00 2001
From: Vasileios Karakasis <karakasis@cscs.ch>
Date: Sun, 16 Oct 2016 17:04:23 +0200
Subject: [PATCH] Fixes Clang 7.0 failure to compile.

* Container assignment requires that the elements of the target
  container are copy constructible, whereas `unique_ptr`s in Clang 7.0
  are only move constructible, preventing `rangeutil.hpp` from
  compiling.

* Includes correct header (`<numeric>`) that provides `std::accumulate()`.
---
 src/cell.hpp           |  1 -
 src/util/rangeutil.hpp | 32 +++++++++++++++++++++++++++++---
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/cell.hpp b/src/cell.hpp
index 11f938f5..6cadd28d 100644
--- a/src/cell.hpp
+++ b/src/cell.hpp
@@ -242,4 +242,3 @@ cable_segment* cell::add_cable(cell::index_type parent, Args ...args)
 
 } // namespace mc
 } // namespace nest
-
diff --git a/src/util/rangeutil.hpp b/src/util/rangeutil.hpp
index 46101e3e..7d13aa0b 100644
--- a/src/util/rangeutil.hpp
+++ b/src/util/rangeutil.hpp
@@ -7,10 +7,12 @@
 
 #include <algorithm>
 #include <iterator>
+#include <numeric>
 
 #include <util/meta.hpp>
 #include <util/range.hpp>
 #include <util/transform.hpp>
+#include <util/meta.hpp>
 
 namespace nest {
 namespace mc {
@@ -60,18 +62,42 @@ Container& append(Container &c, const Seq& seq) {
 // Assign sequence to a container
 
 template <typename AssignableContainer, typename Seq>
-AssignableContainer& assign(AssignableContainer& c, const Seq& seq) {
+enable_if_t<
+    std::is_copy_constructible<typename AssignableContainer::value_type>::value,
+    AssignableContainer&
+>
+assign(AssignableContainer& c, const Seq& seq) {
     auto canon = canonical_view(seq);
     c.assign(std::begin(canon), std::end(canon));
     return c;
 }
 
+
+// This version of assing is needed for assigning segment_ptr's (i.e.,
+// unique_ptr's) with Clang
+
+template<typename AssignableContainer, typename Seq>
+enable_if_t<
+    !std::is_copy_constructible<typename AssignableContainer::value_type>::value &&
+     std::is_move_constructible<typename AssignableContainer::value_type>::value,
+    AssignableContainer&
+>
+assign(AssignableContainer& c, const Seq& seq)
+{
+    auto citer = c.begin();
+    for (auto s : canonical_view(seq)) {
+        *citer = std::move(s);
+    }
+
+    return c;
+}
+
+
 // Assign sequence to a container with transform `proj`
 
 template <typename AssignableContainer, typename Seq, typename Proj>
 AssignableContainer& assign_by(AssignableContainer& c, const Seq& seq, const Proj& proj) {
-    auto canon = canonical_view(transform_view(seq, proj));
-    c.assign(std::begin(canon), std::end(canon));
+    assign(c, transform_view(seq, proj));
     return c;
 }
 
-- 
GitLab