Fix: update() parent pointers not updated after recursive merge with JSON_DIAGNOSTICS (#5187)

* added fix for issue 4813

Signed-off-by: VasuBhakt <cpswastik31@gmail.com>

* added regression test for 4813

Signed-off-by: VasuBhakt <cpswastik31@gmail.com>

* moved test from unit-regression2 to unit-diagnostics

Signed-off-by: VasuBhakt <cpswastik31@gmail.com>

---------

Signed-off-by: VasuBhakt <cpswastik31@gmail.com>
diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp
index 47d5c51..5e44e8d 100644
--- a/include/nlohmann/json.hpp
+++ b/include/nlohmann/json.hpp
@@ -3497,6 +3497,9 @@
                 if (it2 != m_data.m_value.object->end())
                 {
                     it2->second.update(it.value(), true);
+#if JSON_DIAGNOSTICS
+                    it2->second.set_parents();
+#endif
                     continue;
                 }
             }
diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp
index 2e16ad5..d2165e8 100644
--- a/single_include/nlohmann/json.hpp
+++ b/single_include/nlohmann/json.hpp
@@ -24000,6 +24000,9 @@
                 if (it2 != m_data.m_value.object->end())
                 {
                     it2->second.update(it.value(), true);
+#if JSON_DIAGNOSTICS
+                    it2->second.set_parents();
+#endif
                     continue;
                 }
             }
diff --git a/tests/src/unit-diagnostics.cpp b/tests/src/unit-diagnostics.cpp
index c5feafe..1e8ed6a 100644
--- a/tests/src/unit-diagnostics.cpp
+++ b/tests/src/unit-diagnostics.cpp
@@ -262,4 +262,16 @@
 
         CHECK(k.dump() == "{\"prop1\":\"prop1_value\",\"root\":\"root_str\"}");
     }
+
+    SECTION("Regression test for issue #4813 - update() with merge_objects=true triggers JSON_ASSERT with JSON_DIAGNOSTICS")
+    {
+        // https://github.com/nlohmann/json/issues/4813
+        nlohmann::ordered_json j1 = {{"numbers", {{"one", 1}}}};
+        nlohmann::ordered_json const j2 = {{"numbers", {{"two", 2}}}, {"string", "t"}};
+        CHECK_NOTHROW(j1.update(j2, true));
+        CHECK(j1["numbers"]["one"] == 1);
+        CHECK(j1["numbers"]["two"] == 2);
+        CHECK(j1["string"] == "t");
+    }
 }
+