From 3bfa8e58638259aa27a989bf7314b3694d76d6f9 Mon Sep 17 00:00:00 2001
From: Mark Haines <mark.haines@matrix.org>
Date: Wed, 15 Jul 2015 16:31:45 +0100
Subject: [PATCH] Fix bug in list where the wrong value was copied if an item
 was inserted at the beinging of the list

---
 include/olm/list.hh |  8 ++++----
 tests/test_list.cpp | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/include/olm/list.hh b/include/olm/list.hh
index e4bf951..6906c87 100644
--- a/include/olm/list.hh
+++ b/include/olm/list.hh
@@ -69,10 +69,10 @@ public:
         } else if (pos == _end) {
             --pos;
         }
-        T * tmp = pos;
-        while (tmp != _end - 1) {
-            *(tmp + 1) = *tmp;
-            ++tmp;
+        T * tmp = _end - 1;
+        while (tmp != pos) {
+            *tmp = *(tmp - 1);
+            --tmp;
         }
         return pos;
     }
diff --git a/tests/test_list.cpp b/tests/test_list.cpp
index c6d9a9a..c054af6 100644
--- a/tests/test_list.cpp
+++ b/tests/test_list.cpp
@@ -44,6 +44,28 @@ assert_equals(4, test_list[3]);
 
 } /** List insert test **/
 
+{ /** List insert beginning test **/
+
+TestCase test_case("List insert beginning");
+
+olm::List<int, 4> test_list;
+
+assert_equals(std::size_t(0), test_list.size());
+
+for (int i = 0; i < 4; ++i) {
+    test_list.insert(test_list.begin(), i);
+}
+
+assert_equals(std::size_t(4), test_list.size());
+
+int i = 4;
+for (auto item : test_list) {
+    assert_equals(--i, item);
+}
+
+} /** List insert test **/
+
+
 { /** List erase test **/
 TestCase test_case("List erase");
 
-- 
GitLab