From daba1b6a0b52fda6fd4425be9c08a6a7767f53d7 Mon Sep 17 00:00:00 2001
From: Mike Bogdanov <contact@bogemic.com>
Date: Tue, 5 Dec 2017 14:27:08 +0300
Subject: [PATCH 1/2] fixed conformance with C++17, some members of allocator
 are depricated and should be used via allocator_traits

---
 src/json.hpp | 42 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 3 deletions(-)

diff --git a/src/json.hpp b/src/json.hpp
index 5b4bec8a..86c66f87 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -7944,12 +7944,15 @@ class basic_json
     static T* create(Args&& ... args)
     {
         AllocatorType<T> alloc;
+
+		using AllocatorTraits = std::allocator_traits<AllocatorType<T>>;
+
         auto deleter = [&](T * object)
         {
-            alloc.deallocate(object, 1);
+			AllocatorTraits::deallocate(alloc, object, 1);
         };
-        std::unique_ptr<T, decltype(deleter)> object(alloc.allocate(1), deleter);
-        alloc.construct(object.get(), std::forward<Args>(args)...);
+        std::unique_ptr<T, decltype(deleter)> object(AllocatorTraits::allocate(alloc, 1), deleter);
+		AllocatorTraits::construct(alloc, object.get(), std::forward<Args>(args)...);
         assert(object != nullptr);
         return object.release();
     }
@@ -8937,6 +8940,39 @@ class basic_json
     ~basic_json()
     {
         assert_invariant();
+
+        switch (m_type)
+        {
+            case value_t::object:
+            {
+                AllocatorType<object_t> alloc;
+				std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.object);
+				std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.object, 1);
+                break;
+            }
+
+            case value_t::array:
+            {
+                AllocatorType<array_t> alloc;
+				std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.array);
+				std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.array, 1);
+                break;
+            }
+
+            case value_t::string:
+            {
+                AllocatorType<string_t> alloc;
+				std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);
+				std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);
+                break;
+            }
+
+            default:
+            {
+                // all other types need no specific destructor
+                break;
+            }
+        }
         m_value.destroy(m_type);
     }
 

From 8890b935fdc323ac84d02b875345d885fd8399de Mon Sep 17 00:00:00 2001
From: Mike Bogdanov <contact@bogemic.com>
Date: Wed, 6 Dec 2017 12:24:50 +0300
Subject: [PATCH 2/2] fixed merge conflicts

---
 src/json.hpp | 89 +++++++++++++++++-----------------------------------
 1 file changed, 28 insertions(+), 61 deletions(-)

diff --git a/src/json.hpp b/src/json.hpp
index 86c66f87..ab2b7d93 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -8115,37 +8115,37 @@ class basic_json
 
         void destroy(value_t t)
         {
-            switch (t)
-            {
-                case value_t::object:
-                {
-                    AllocatorType<object_t> alloc;
-                    alloc.destroy(object);
-                    alloc.deallocate(object, 1);
-                    break;
-                }
+			switch (t)
+			{
+				case value_t::object:
+				{
+					AllocatorType<object_t> alloc;
+					std::allocator_traits<decltype(alloc)>::destroy(alloc, object);
+					std::allocator_traits<decltype(alloc)>::deallocate(alloc, object, 1);
+					break;
+				}
 
-                case value_t::array:
-                {
-                    AllocatorType<array_t> alloc;
-                    alloc.destroy(array);
-                    alloc.deallocate(array, 1);
-                    break;
-                }
+				case value_t::array:
+				{
+					AllocatorType<array_t> alloc;
+					std::allocator_traits<decltype(alloc)>::destroy(alloc, array);
+					std::allocator_traits<decltype(alloc)>::deallocate(alloc, array, 1);
+					break;
+				}
 
-                case value_t::string:
-                {
-                    AllocatorType<string_t> alloc;
-                    alloc.destroy(string);
-                    alloc.deallocate(string, 1);
-                    break;
-                }
+				case value_t::string:
+				{
+					AllocatorType<string_t> alloc;
+					std::allocator_traits<decltype(alloc)>::destroy(alloc, string);
+					std::allocator_traits<decltype(alloc)>::deallocate(alloc, string, 1);
+					break;
+				}
 
-                default:
-                {
-                    break;
-                }
-            }
+				default:
+				{
+					break;
+				}
+			}
         }
     };
 
@@ -8940,39 +8940,6 @@ class basic_json
     ~basic_json()
     {
         assert_invariant();
-
-        switch (m_type)
-        {
-            case value_t::object:
-            {
-                AllocatorType<object_t> alloc;
-				std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.object);
-				std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.object, 1);
-                break;
-            }
-
-            case value_t::array:
-            {
-                AllocatorType<array_t> alloc;
-				std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.array);
-				std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.array, 1);
-                break;
-            }
-
-            case value_t::string:
-            {
-                AllocatorType<string_t> alloc;
-				std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.string);
-				std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);
-                break;
-            }
-
-            default:
-            {
-                // all other types need no specific destructor
-                break;
-            }
-        }
         m_value.destroy(m_type);
     }