diff --git a/src/google/protobuf/json/internal/untyped_message.cc b/src/google/protobuf/json/internal/untyped_message.cc index 013bc8e423..ee34a7f215 100644 --- a/src/google/protobuf/json/internal/untyped_message.cc +++ b/src/google/protobuf/json/internal/untyped_message.cc @@ -300,7 +300,7 @@ absl::Status UntypedMessage::Decode(io::CodedInputStream& stream, UntypedMessage group(*group_desc); RETURN_IF_ERROR(group.Decode(stream, field_number)); - RETURN_IF_ERROR(InsertField(*field, std::move(group))); + RETURN_IF_ERROR(InsertField(*field, std::move(group))); break; } case WireFormatLite::WIRETYPE_END_GROUP: @@ -473,7 +473,7 @@ absl::Status UntypedMessage::DecodeDelimited(io::CodedInputStream& stream, } } - RETURN_IF_ERROR(InsertField(field, std::move(buf))); + RETURN_IF_ERROR(InsertField(field, std::move(buf))); break; } case Field::TYPE_MESSAGE: { @@ -482,7 +482,7 @@ absl::Status UntypedMessage::DecodeDelimited(io::CodedInputStream& stream, auto inner = ParseFromStream(*inner_desc, stream); RETURN_IF_ERROR(inner.status()); - RETURN_IF_ERROR(InsertField(field, std::move(*inner))); + RETURN_IF_ERROR(InsertField(field, std::move(*inner))); break; } default: { @@ -523,9 +523,9 @@ absl::Status UntypedMessage::DecodeDelimited(io::CodedInputStream& stream, template absl::Status UntypedMessage::InsertField(const ResolverPool::Field& field, - T value) { + T&& value) { int32_t number = field.proto().number(); - auto emplace_result = fields_.try_emplace(number, std::move(value)); + auto emplace_result = fields_.try_emplace(number, std::forward(value)); if (emplace_result.second) { return absl::OkStatus(); } @@ -537,17 +537,18 @@ absl::Status UntypedMessage::InsertField(const ResolverPool::Field& field, } Value& slot = emplace_result.first->second; - if (auto* extant = absl::get_if(&slot)) { - std::vector repeated; + using value_type = std::decay_t; + if (auto* extant = absl::get_if(&slot)) { + std::vector repeated; repeated.push_back(std::move(*extant)); - repeated.push_back(std::move(value)); + repeated.push_back(std::forward(value)); slot = std::move(repeated); - } else if (auto* extant = absl::get_if>(&slot)) { - extant->push_back(std::move(value)); + } else if (auto* extant = absl::get_if>(&slot)) { + extant->push_back(std::forward(value)); } else { absl::optional name = - google::protobuf::internal::RttiTypeName(); + google::protobuf::internal::RttiTypeName(); if (!name.has_value()) { name = ""; } diff --git a/src/google/protobuf/json/internal/untyped_message.h b/src/google/protobuf/json/internal/untyped_message.h index 2b2c264f56..37372dfb2c 100644 --- a/src/google/protobuf/json/internal/untyped_message.h +++ b/src/google/protobuf/json/internal/untyped_message.h @@ -224,7 +224,7 @@ class UntypedMessage final { const ResolverPool::Field& field); template - absl::Status InsertField(const ResolverPool::Field& field, T value); + absl::Status InsertField(const ResolverPool::Field& field, T&& value); const ResolverPool::Message* desc_; absl::flat_hash_map fields_;