about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.cc12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 5351ca0c345a..517a1151ec69 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -922,11 +922,19 @@ void ExprOpConcatLists::eval(EvalState & state, Env & env, Value & v)
 void EvalState::concatLists(Value & v, unsigned int nrLists, Value * * lists)
 {
     nrListConcats++;
-    
+
+    Value * nonEmpty = 0;
     unsigned int len = 0;
     for (unsigned int n = 0; n < nrLists; ++n) {
         forceList(*lists[n]);
-        len += lists[n]->list.length;
+        unsigned int l = lists[n]->list.length;
+        len += l;
+        if (l) nonEmpty = lists[n];
+    }
+
+    if (nonEmpty && len == nonEmpty->list.length) {
+        v = *nonEmpty;
+        return;
     }
 
     mkList(v, len);