From d812fa5edc0ed073b8ab723259b3e25fabe1bfb6 Mon Sep 17 00:00:00 2001 From: Uy Ha Date: Tue, 2 Apr 2024 01:22:07 +0000 Subject: [PATCH] Fix compilation error when `std::variant` has the same types --- include/msgpack/v1/adaptor/cpp17/variant.hpp | 4 ++-- test/msgpack_cpp17.cpp | 22 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/include/msgpack/v1/adaptor/cpp17/variant.hpp b/include/msgpack/v1/adaptor/cpp17/variant.hpp index 2ddb6b6e6..d96a15eb0 100644 --- a/include/msgpack/v1/adaptor/cpp17/variant.hpp +++ b/include/msgpack/v1/adaptor/cpp17/variant.hpp @@ -40,11 +40,11 @@ Variant construct_variant( std::index_sequence ) { if constexpr(sizeof...(Ts) == 0) { - return object.as(); + return Variant{std::in_place_index, object.as()}; } else { if (index == current_index) { - return object.as(); + return Variant{std::in_place_index, object.as()}; } return construct_variant( index, diff --git a/test/msgpack_cpp17.cpp b/test/msgpack_cpp17.cpp index b20c04ccd..be3d9d410 100644 --- a/test/msgpack_cpp17.cpp +++ b/test/msgpack_cpp17.cpp @@ -474,6 +474,28 @@ BOOST_AUTO_TEST_CASE(variant_pack_unpack_as) { oh.get().as >(); BOOST_CHECK(val1 == val2); BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); + + { + std::stringstream same_ss; + std::variant same_expected{std::in_place_index<2>, 2}; + msgpack::pack(same_ss, same_expected); + std::string const& same_str = same_ss.str(); + msgpack::object_handle same_oh = + msgpack::unpack(same_str.data(), same_str.size()); + std::variant same_actual = same_oh->as>(); + BOOST_CHECK(same_expected == same_actual); + } + + { + std::stringstream same_ss; + std::variant same_expected{std::in_place_index<1>, 2}; + msgpack::pack(same_ss, same_expected); + std::string const& same_str = same_ss.str(); + msgpack::object_handle same_oh = + msgpack::unpack(same_str.data(), same_str.size()); + std::variant same_actual = same_oh->as>(); + BOOST_CHECK(same_expected == same_actual); + } } BOOST_AUTO_TEST_CASE(variant_with_zone) {