From d6c4e0661e039bd991a56d5c408b64cf1ac0ceed Mon Sep 17 00:00:00 2001 From: Ramya Eliger Date: Sat, 15 Aug 2026 17:24:07 +0530 Subject: [PATCH 1/3] forward mapped value in object::insert_or_assign assign branch --- include/boost/json/impl/object.hpp | 2 +- test/object.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/boost/json/impl/object.hpp b/include/boost/json/impl/object.hpp index 976c334b7..9580a81c2 100644 --- a/include/boost/json/impl/object.hpp +++ b/include/boost/json/impl/object.hpp @@ -398,7 +398,7 @@ insert_or_assign( key, key, static_cast(m) ); if( !result.second ) { - value(static_cast(m), sp_).swap( + value(static_cast(m), sp_).swap( result.first->value()); } return result; diff --git a/test/object.cpp b/test/object.cpp index 17b2a752f..c0933cfae 100644 --- a/test/object.cpp +++ b/test/object.cpp @@ -1201,6 +1201,17 @@ class object_test { "k3", 3 }, { "k4", 2 }})); } + + // rvalue is moved, not copied, on the assign branch + { + object o = { + { "k1", 1 }, + { "k2", { 1, 2, 3 } } }; + value v = { 4, 5, 6 }; + o.insert_or_assign("k2", std::move(v)); + BOOST_TEST(o.at("k2") == (array{4, 5, 6})); + BOOST_TEST(v.as_array().empty()); + } } // emplace(key, arg) From b7457fe41db6cad640c388635437bbe7acee57c8 Mon Sep 17 00:00:00 2001 From: Ramya Eliger Date: Tue, 18 Aug 2026 16:26:05 +0530 Subject: [PATCH 2/3] check moved buffer identity via data pointer in insert_or_assign test --- test/object.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/object.cpp b/test/object.cpp index c0933cfae..7863c2a57 100644 --- a/test/object.cpp +++ b/test/object.cpp @@ -1208,9 +1208,10 @@ class object_test { "k1", 1 }, { "k2", { 1, 2, 3 } } }; value v = { 4, 5, 6 }; + auto const d = v.as_array().data(); o.insert_or_assign("k2", std::move(v)); BOOST_TEST(o.at("k2") == (array{4, 5, 6})); - BOOST_TEST(v.as_array().empty()); + BOOST_TEST(o.at("k2").as_array().data() == d); } } From 08e993d4c0461819bd231fe948d8e595c712a8f7 Mon Sep 17 00:00:00 2001 From: Ramya Eliger Date: Wed, 19 Aug 2026 11:26:59 +0530 Subject: [PATCH 3/3] drop redundant equality check in insert_or_assign move test --- test/object.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/object.cpp b/test/object.cpp index 7863c2a57..efd88cae0 100644 --- a/test/object.cpp +++ b/test/object.cpp @@ -1210,7 +1210,6 @@ class object_test value v = { 4, 5, 6 }; auto const d = v.as_array().data(); o.insert_or_assign("k2", std::move(v)); - BOOST_TEST(o.at("k2") == (array{4, 5, 6})); BOOST_TEST(o.at("k2").as_array().data() == d); } }