Remove unused initialization and copy methods from FieldGeneratorBase. `GenerateAggregateInitializer` and `GenerateCopyAggregateInitializer` have no remaining callers after migrating message construction to member initializers. `GenerateCopyConstructorCode` was only called from `GenerateMergeFrom` for POD fields (`SingularPrimitive` and `SingularEnum`), where its implementation is identical to `GenerateMergingCode`. Call `GenerateMergingCode` unconditionally in `GenerateMergeFrom` and remove `IsPOD`, `GenerateCopyConstructorCode`, `GenerateAggregateInitializer`, and `GenerateCopyAggregateInitializer` across `FieldGeneratorBase`, `FieldGenerator`, and all field generators. PiperOrigin-RevId: 1000216254
diff --git a/src/google/protobuf/compiler/cpp/field.cc b/src/google/protobuf/compiler/cpp/field.cc index 9d4e2d1..ea92f79 100644 --- a/src/google/protobuf/compiler/cpp/field.cc +++ b/src/google/protobuf/compiler/cpp/field.cc
@@ -215,18 +215,6 @@ p->Emit("$field_$ = $from_field$;\n"); } -void FieldGeneratorBase::GenerateAggregateInitializer(io::Printer* p) const { - if (ShouldSplit(field_, options_)) { - p->Emit(R"cc( - decltype(Impl_::Split::$name$_){arena}, - )cc"); - } else { - p->Emit(R"cc( - decltype($field_$){arena}, - )cc"); - } -} - void FieldGeneratorBase::GenerateConstexprAggregateInitializer( io::Printer* p) const { p->Emit(R"cc( @@ -234,22 +222,6 @@ )cc"); } -void FieldGeneratorBase::GenerateCopyAggregateInitializer( - io::Printer* p) const { - p->Emit(R"cc( - decltype($field_$){$from_field$}, - )cc"); -} - -void FieldGeneratorBase::GenerateCopyConstructorCode(io::Printer* p) const { - if (should_split()) { - // There is no copy constructor for the `Split` struct, so we need to copy - // the value here. - Formatter format(p, variables_); - format("$field_$ = $from_field$;\n"); - } -} - pb::CppFeatures::StringType FieldGeneratorBase::GetDeclaredStringType() const { return CppGenerator::GetResolvedSourceFeatures(*field_) .GetExtension(pb::cpp)
diff --git a/src/google/protobuf/compiler/cpp/field.h b/src/google/protobuf/compiler/cpp/field.h index 715392d..8acbb20 100644 --- a/src/google/protobuf/compiler/cpp/field.h +++ b/src/google/protobuf/compiler/cpp/field.h
@@ -140,8 +140,6 @@ virtual void GenerateMergingCode(io::Printer* p) const = 0; - virtual void GenerateCopyConstructorCode(io::Printer* p) const; - virtual void GenerateSwappingCode(io::Printer* p) const = 0; virtual void GenerateDestructorCode(io::Printer* p) const {} @@ -177,12 +175,8 @@ // - `field_ = from.field_` virtual void GenerateOneofCopyConstruct(io::Printer* p) const; - virtual void GenerateAggregateInitializer(io::Printer* p) const; - virtual void GenerateConstexprAggregateInitializer(io::Printer* p) const; - virtual void GenerateCopyAggregateInitializer(io::Printer* p) const; - virtual void GenerateSerializeWithCachedSizesToArray( io::Printer* p) const = 0; @@ -393,14 +387,6 @@ impl_->GenerateMergingCode(p); } - // Generates a copy constructor - // - // TODO: Document this properly. - void GenerateCopyConstructorCode(io::Printer* p) const { - auto vars = PushVarsForCall(p); - impl_->GenerateCopyConstructorCode(p); - } - // Generates statements which swap this field and the corresponding field of // another message, which is stored in the generated code variable `other`. // @@ -428,24 +414,6 @@ impl_->GenerateArenaDestructorCode(p); } - // Generates initialization code for private members declared by - // GeneratePrivateMembers(). - // - // These go into the SharedCtor's aggregate initialization of the _impl_ - // struct and must follow the syntax `decltype($field_$){$default$}`. - // Does not include `:` or `,` separators. Default values should be specified - // here when possible. - // - // NOTE: We use `decltype($field_$)` for both explicit construction and the - // fact that it's self-documenting. Pre-C++17, copy elision isn't guaranteed - // in aggregate initialization so a valid copy/move constructor must exist - // (even though it's not used). Because of this, we need to comment out the - // decltype and fallback to implicit construction. - void GenerateAggregateInitializer(io::Printer* p) const { - auto vars = PushVarsForCall(p); - impl_->GenerateAggregateInitializer(p); - } - // Generates constinit initialization code for private members declared by // GeneratePrivateMembers(). // @@ -457,17 +425,6 @@ impl_->GenerateConstexprAggregateInitializer(p); } - // Generates copy initialization code for private members declared by - // GeneratePrivateMembers(). - // - // These go into the copy constructor's aggregate initialization of the _impl_ - // struct and must follow the syntax `decltype($field_$){$from_field$}` (see - // above). Does not include `:` or `,` separators. - void GenerateCopyAggregateInitializer(io::Printer* p) const { - auto vars = PushVarsForCall(p); - impl_->GenerateCopyAggregateInitializer(p); - } - // Generates statements to serialize this field directly to the array // `target`, which are placed within the message's // SerializeWithCachedSizesToArray() method.
diff --git a/src/google/protobuf/compiler/cpp/field_generators/cord_field.cc b/src/google/protobuf/compiler/cpp/field_generators/cord_field.cc index ca91f9c..185901c 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/cord_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/cord_field.cc
@@ -73,7 +73,6 @@ void GenerateArenaDestructorCode(io::Printer* p) const override; void GenerateSerializeWithCachedSizesToArray(io::Printer* p) const override; void GenerateByteSize(io::Printer* p) const override; - void GenerateAggregateInitializer(io::Printer* p) const override; void GenerateConstexprAggregateInitializer(io::Printer* p) const override; ArenaDtorNeeds NeedsArenaDestructor() const override { return ArenaDtorNeeds::kRequired; @@ -321,18 +320,6 @@ } } -void CordFieldGenerator::GenerateAggregateInitializer(io::Printer* p) const { - if (should_split()) { - p->Emit(R"cc( - decltype(Impl_::Split::$name$_){}, - )cc"); - } else { - p->Emit(R"cc( - decltype($field_$){}, - )cc"); - } -} - // =================================================================== CordOneofFieldGenerator::CordOneofFieldGenerator(
diff --git a/src/google/protobuf/compiler/cpp/field_generators/enum_field.cc b/src/google/protobuf/compiler/cpp/field_generators/enum_field.cc index f9c4023..a63d3c5 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/enum_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/enum_field.cc
@@ -98,12 +98,6 @@ )cc"); } - void GenerateCopyConstructorCode(io::Printer* p) const override { - p->Emit(R"cc( - $this_mutable_field$ = $from_field$; - )cc"); - } - void GenerateSerializeWithCachedSizesToArray(io::Printer* p) const override { p->Emit(R"cc( target = stream->EnsureSpace(target); @@ -125,24 +119,6 @@ )cc"); } - void GenerateAggregateInitializer(io::Printer* p) const override { - if (should_split()) { - p->Emit(R"cc( - decltype(Impl_::Split::$name$_){$kDefault$}, - )cc"); - } else { - p->Emit(R"cc( - decltype($field_$){$kDefault$}, - )cc"); - } - } - - void GenerateCopyAggregateInitializer(io::Printer* p) const override { - p->Emit(R"cc( - decltype($field_$){}, - )cc"); - } - void GenerateAccessorDeclarations(io::Printer* p) const override; void GeneratePrivateAccessorDeclarations(io::Printer* p) const override; void GenerateInlineAccessorDefinitions(io::Printer* p) const override; @@ -322,19 +298,6 @@ )cc"); } - void GenerateAggregateInitializer(io::Printer* p) const override { - p->Emit({InternalMetadataOffsetSub(p)}, - R"cc( - decltype($field_$){$internal_metadata_offset$}, - )cc"); - } - - void GenerateCopyAggregateInitializer(io::Printer* p) const override { - p->Emit(R"cc( - decltype($field_$){from._internal_$name$()}, - )cc"); - } - void GenerateMemberConstexprConstructor(io::Printer* p) const override { p->Emit({InternalMetadataOffsetSub(p)}, R"cc( @@ -362,16 +325,6 @@ ABSL_LOG(FATAL) << "Not supported"; } - void GenerateCopyConstructorCode(io::Printer* p) const override { - if (should_split()) { - p->Emit(R"cc( - if (!from._internal_$name$().empty()) { - _internal_mutable_$name$()->MergeFrom(from._internal_$name$()); - } - )cc"); - } - } - void GenerateAccessorDeclarations(io::Printer* p) const override; void GeneratePrivateAccessorDeclarations(io::Printer* p) const override; void GenerateInlineAccessorDefinitions(io::Printer* p) const override;
diff --git a/src/google/protobuf/compiler/cpp/field_generators/map_field.cc b/src/google/protobuf/compiler/cpp/field_generators/map_field.cc index 3d6e866..c53a9b7 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/map_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/map_field.cc
@@ -114,10 +114,6 @@ )cc"); } - void GenerateCopyConstructorCode(io::Printer* p) const override { - GenerateMergingCode(p); - } - void GenerateIsInitialized(io::Printer* p) const override { if (!NeedsIsInitialized()) return; @@ -136,29 +132,6 @@ )cc"); } - void GenerateCopyAggregateInitializer(io::Printer* p) const override { - // MapField has no move constructor, which prevents explicit aggregate - // initialization pre-C++17. - p->Emit(R"cc( - /* decltype($field_$) */ {}, - )cc"); - } - - void GenerateAggregateInitializer(io::Printer* p) const override { - if (should_split()) { - p->Emit(R"cc( - /* decltype($Msg$::Split::$name$_) */ { - $pbi$::ArenaInitialized(), - arena, - }, - )cc"); - } else { - p->Emit(R"cc( - /* decltype($field_$) */ {$pbi$::ArenaInitialized(), arena}, - )cc"); - } - } - void GenerateDestructorCode(io::Printer* p) const override { if (should_split()) { p->Emit(R"cc(
diff --git a/src/google/protobuf/compiler/cpp/field_generators/message_field.cc b/src/google/protobuf/compiler/cpp/field_generators/message_field.cc index 834cc40..8d2a6d7 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/message_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/message_field.cc
@@ -110,14 +110,11 @@ void GenerateMergingCode(io::Printer* p) const override; void GenerateSwappingCode(io::Printer* p) const override; void GenerateDestructorCode(io::Printer* p) const override; - void GenerateCopyConstructorCode(io::Printer* p) const override; void GenerateSerializeWithCachedSizesToArray(io::Printer* p) const override; void GenerateByteSize(io::Printer* p) const override; void GenerateIsInitialized(io::Printer* p) const override; bool NeedsIsInitialized() const override; void GenerateConstexprAggregateInitializer(io::Printer* p) const override; - void GenerateAggregateInitializer(io::Printer* p) const override; - void GenerateCopyAggregateInitializer(io::Printer* p) const override; void GenerateMemberConstexprConstructor(io::Printer* p) const override { p->Emit("$name$_{nullptr}"); @@ -384,15 +381,6 @@ } } -void SingularMessage::GenerateCopyConstructorCode(io::Printer* p) const { - ABSL_CHECK(has_hasbit_); - p->Emit(R"cc( - if (CheckHasBit(from.$has_bits_array$, $has_mask$)) { - $this_mutable_field$ = Super_::CopyConstruct(arena, *$from_field$); - } - )cc"); -} - void SingularMessage::GenerateSerializeWithCachedSizesToArray( io::Printer* p) const { if (!is_group()) { @@ -446,24 +434,6 @@ )cc"); } -void SingularMessage::GenerateCopyAggregateInitializer(io::Printer* p) const { - p->Emit(R"cc( - decltype($field_$){nullptr}, - )cc"); -} - -void SingularMessage::GenerateAggregateInitializer(io::Printer* p) const { - if (should_split()) { - p->Emit(R"cc( - decltype(Impl_::Split::$name$_){nullptr}, - )cc"); - } else { - p->Emit(R"cc( - decltype($field_$){nullptr}, - )cc"); - } -} - class OneofMessage : public SingularMessage { public: OneofMessage(const FieldDescriptor* descriptor, const Options& options) @@ -510,7 +480,6 @@ void GenerateClearingCode(io::Printer* p) const override; void GenerateSwappingCode(io::Printer* p) const override; void GenerateDestructorCode(io::Printer* p) const override; - void GenerateCopyConstructorCode(io::Printer* p) const override; void GenerateIsInitialized(io::Printer* p) const override; bool NeedsIsInitialized() const override; void GenerateMergingCode(io::Printer* p) const override; @@ -666,15 +635,6 @@ // behavior. } -void OneofMessage::GenerateCopyConstructorCode(io::Printer* p) const { - ABSL_CHECK(!has_hasbit_); - p->Emit(R"cc( - if (from._internal_has_$name$()) { - $this_mutable_field$ = Super_::CopyConstruct(arena, *$from_field$); - } - )cc"); -} - void OneofMessage::GenerateIsInitialized(io::Printer* p) const { if (!NeedsIsInitialized()) return; @@ -731,7 +691,6 @@ void GenerateMessageClearingCode(io::Printer* p) const override; void GenerateMergingCode(io::Printer* p) const override; void GenerateSwappingCode(io::Printer* p) const override; - void GenerateCopyConstructorCode(io::Printer* p) const override; void GenerateDestructorCode(io::Printer* p) const override; void GenerateSerializeWithCachedSizesToArray(io::Printer* p) const override; void GenerateByteSize(io::Printer* p) const override; @@ -1001,20 +960,6 @@ )cc"); } -void RepeatedMessage::GenerateCopyConstructorCode(io::Printer* p) const { - // TODO: For split repeated fields we might want to use type - // erasure to reduce binary size costs. - if (should_split()) { - p->Emit(R"cc( - if (!from._internal$_weak$_$name$().empty()) { - _internal_mutable$_weak$_$name$()->InternalMergeFromWithArena( - $pb$::MessageLite::internal_visibility(), arena, - from._internal$_weak$_$name$()); - } - )cc"); - } -} - void RepeatedMessage::GenerateDestructorCode(io::Printer* p) const { if (should_split()) { p->Emit(R"cc(
diff --git a/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc b/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc index d92df4a..1e11ee9 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc
@@ -134,30 +134,12 @@ )cc"); } - void GenerateCopyConstructorCode(io::Printer* p) const override { - p->Emit(R"cc( - $this_mutable_field$ = $from_field$; - )cc"); - } - void GenerateConstexprAggregateInitializer(io::Printer* p) const override { p->Emit(R"cc( /*decltype($field_$)*/ $kDefault$, )cc"); } - void GenerateAggregateInitializer(io::Printer* p) const override { - p->Emit(R"cc( - decltype($field_$){$kDefault$}, - )cc"); - } - - void GenerateCopyAggregateInitializer(io::Printer* p) const override { - p->Emit(R"cc( - decltype($field_$){}, - )cc"); - } - void GenerateAccessorDeclarations(io::Printer* p) const override; void GeneratePrivateAccessorDeclarations(io::Printer* p) const override; void GenerateInlineAccessorDefinitions(io::Printer* p) const override; @@ -350,37 +332,12 @@ } } - void GenerateCopyConstructorCode(io::Printer* p) const override { - if (should_split()) { - p->Emit(R"cc( - if (!from._internal_$name$().empty()) { - _internal_mutable_$name$()->MergeFrom(from._internal_$name$()); - } - )cc"); - } - } - void GenerateConstexprAggregateInitializer(io::Printer* p) const override { p->Emit(R"cc( /*decltype($field_$)*/ {}, )cc"); } - void GenerateAggregateInitializer(io::Printer* p) const override { - ABSL_CHECK(!should_split()); - p->Emit({InternalMetadataOffsetSub(p)}, - R"cc( - decltype($field_$){$internal_metadata_offset$}, - )cc"); - } - - void GenerateCopyAggregateInitializer(io::Printer* p) const override { - ABSL_CHECK(!should_split()); - p->Emit(R"cc( - decltype($field_$){$from_field$}, - )cc"); - } - void GenerateMemberConstexprConstructor(io::Printer* p) const override { p->Emit({InternalMetadataOffsetSub(p)}, R"cc(
diff --git a/src/google/protobuf/compiler/cpp/field_generators/string_field.cc b/src/google/protobuf/compiler/cpp/field_generators/string_field.cc index 27dd2f1..92bb1e4 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/string_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/string_field.cc
@@ -125,12 +125,6 @@ )cc"); } - void GenerateCopyAggregateInitializer(io::Printer* p) const override { - p->Emit(R"cc( - decltype($field_$){}, - )cc"); - } - void GenerateMemberConstexprConstructor(io::Printer* p) const override { if (is_inlined()) { p->Emit("$name$_{}"); @@ -177,11 +171,9 @@ void GenerateClearingCode(io::Printer* p) const override; void GenerateMessageClearingCode(io::Printer* p) const override; void GenerateSwappingCode(io::Printer* p) const override; - void GenerateCopyConstructorCode(io::Printer* p) const override; void GenerateDestructorCode(io::Printer* p) const override; void GenerateSerializeWithCachedSizesToArray(io::Printer* p) const override; void GenerateConstexprAggregateInitializer(io::Printer* p) const override; - void GenerateAggregateInitializer(io::Printer* p) const override; private: bool EmptyDefault() const { return field_->default_value_string().empty(); } @@ -554,45 +546,6 @@ )cc"); } -void SingularString::GenerateCopyConstructorCode(io::Printer* p) const { - if (!(is_inlined() && EmptyDefault()) && !is_oneof()) { - ABSL_DCHECK(!is_inlined()); - - p->Emit(R"cc( - $field_$.InitDefault(); - )cc"); - - if (IsString(field_) && EmptyDefault()) { - p->Emit(R"cc( - if ($pbi$::DebugHardenForceCopyDefaultString()) { - $field_$.Set("", *this); - } - )cc"); - } - } - - if (is_inlined()) { - p->Emit(R"cc( - new (&$this_mutable_field$)::_pbi::InlinedStringField; - )cc"); - } - - p->Emit( - {{"hazzer", - [&] { - if (HasHasbit(field_, options_)) { - p->Emit(R"cc(CheckHasBit(from.$has_bits_array$, $has_mask$))cc"); - } else { - p->Emit(R"cc(!from._internal_$name$().empty())cc"); - } - }}}, - R"cc( - if ($hazzer$) { - $this_mutable_field$.Set(from._internal_$name$(), this_); - } - )cc"); -} - void SingularString::GenerateDestructorCode(io::Printer* p) const { if (is_inlined()) { ABSL_DCHECK(!should_split()); @@ -642,23 +595,6 @@ } } -void SingularString::GenerateAggregateInitializer(io::Printer* p) const { - if (should_split()) { - ABSL_CHECK(!is_inlined()); - p->Emit(R"cc( - decltype(Impl_::Split::$name$_){}, - )cc"); - } else if (!is_inlined()) { - p->Emit(R"cc( - decltype($field_$){}, - )cc"); - } else { - p->Emit(R"cc( - decltype($field_$){arena}, - )cc"); - } -} - class RepeatedString : public FieldGeneratorBase { public: RepeatedString(const FieldDescriptor* field, const Options& opts) @@ -741,18 +677,6 @@ } } - void GenerateCopyConstructorCode(io::Printer* p) const override { - if (should_split()) { - p->Emit(R"cc( - if (!from._internal_$name$().empty()) { - _internal_mutable_$name$()->InternalMergeFromWithArena( - $pb$::MessageLite::internal_visibility(), arena, - from._internal_$name$()); - } - )cc"); - } - } - void GenerateByteSize(io::Printer* p) const override { p->Emit(R"cc( if (const $pb$::RepeatedPtrField<::std::string>& f = $this_field$;
diff --git a/src/google/protobuf/compiler/cpp/field_generators/string_view_field.cc b/src/google/protobuf/compiler/cpp/field_generators/string_view_field.cc index 36aad88..09ddd02 100644 --- a/src/google/protobuf/compiler/cpp/field_generators/string_view_field.cc +++ b/src/google/protobuf/compiler/cpp/field_generators/string_view_field.cc
@@ -138,12 +138,6 @@ )cc"); } - void GenerateCopyAggregateInitializer(io::Printer* p) const override { - p->Emit(R"cc( - decltype($field_$){}, - )cc"); - } - void GenerateMemberConstexprConstructor(io::Printer* p) const override { if (is_inlined()) { p->Emit("$name$_{}"); @@ -198,11 +192,9 @@ void GenerateClearingCode(io::Printer* p) const override; void GenerateMessageClearingCode(io::Printer* p) const override; void GenerateSwappingCode(io::Printer* p) const override; - void GenerateCopyConstructorCode(io::Printer* p) const override; void GenerateDestructorCode(io::Printer* p) const override; void GenerateSerializeWithCachedSizesToArray(io::Printer* p) const override; void GenerateConstexprAggregateInitializer(io::Printer* p) const override; - void GenerateAggregateInitializer(io::Printer* p) const override; private: bool EmptyDefault() const { return field_->default_value_string().empty(); } @@ -427,45 +419,6 @@ )cc"); } -void SingularStringView::GenerateCopyConstructorCode(io::Printer* p) const { - if (!(is_inlined() && EmptyDefault()) && !is_oneof() && !use_micro_string()) { - ABSL_DCHECK(!is_inlined()); - - p->Emit(R"cc( - $field_$.InitDefault(); - )cc"); - - if (EmptyDefault()) { - p->Emit(R"cc( - if ($pbi$::DebugHardenForceCopyDefaultString()) { - $field_$.Set("", *this); - } - )cc"); - } - } - - if (is_inlined()) { - p->Emit(R"cc( - new (&$this_mutable_field$)::_pbi::InlinedStringField; - )cc"); - } - - p->Emit( - {{"hazzer", - [&] { - if (HasHasbit(field_, options_)) { - p->Emit(R"cc(CheckHasBit(from.$has_bits_array$, $has_mask$))cc"); - } else { - p->Emit(R"cc(!from._internal_$name$().empty())cc"); - } - }}}, - R"cc( - if ($hazzer$) { - $this_mutable_field$.Set(from._internal_$name$(), this_); - } - )cc"); -} - void SingularStringView::GenerateDestructorCode(io::Printer* p) const { if (is_inlined()) { ABSL_DCHECK(!should_split()); @@ -525,23 +478,6 @@ } } -void SingularStringView::GenerateAggregateInitializer(io::Printer* p) const { - if (should_split()) { - ABSL_CHECK(!is_inlined()); - p->Emit(R"cc( - decltype(Impl_::Split::$name$_){}, - )cc"); - } else if (!is_inlined()) { - p->Emit(R"cc( - decltype($field_$){}, - )cc"); - } else { - p->Emit(R"cc( - decltype($field_$){arena}, - )cc"); - } -} - class RepeatedStringView : public FieldGeneratorBase { public: RepeatedStringView(const FieldDescriptor* field, const Options& opts) @@ -624,18 +560,6 @@ } } - void GenerateCopyConstructorCode(io::Printer* p) const override { - if (should_split()) { - p->Emit(R"cc( - if (!from._internal_$name$().empty()) { - _internal_mutable_$name$()->InternalMergeFromWithArena( - $pb$::MessageLite::internal_visibility(), arena, - from._internal_$name$()); - } - )cc"); - } - } - void GenerateByteSize(io::Printer* p) const override { p->Emit(R"cc( if (const $pb$::RepeatedPtrField<::std::string>& f = $this_field$;
diff --git a/src/google/protobuf/compiler/cpp/message.cc b/src/google/protobuf/compiler/cpp/message.cc index 1f5eec4..cbc6772 100644 --- a/src/google/protobuf/compiler/cpp/message.cc +++ b/src/google/protobuf/compiler/cpp/message.cc
@@ -192,25 +192,6 @@ return ranges; } -bool IsPOD(const FieldDescriptor* field) { - if (field->is_repeated() || field->is_extension()) return false; - switch (field->cpp_type()) { - case FieldDescriptor::CPPTYPE_ENUM: - case FieldDescriptor::CPPTYPE_INT32: - case FieldDescriptor::CPPTYPE_INT64: - case FieldDescriptor::CPPTYPE_UINT32: - case FieldDescriptor::CPPTYPE_UINT64: - case FieldDescriptor::CPPTYPE_FLOAT: - case FieldDescriptor::CPPTYPE_DOUBLE: - case FieldDescriptor::CPPTYPE_BOOL: - return true; - case FieldDescriptor::CPPTYPE_STRING: - return false; - default: - return false; - } -} - // Finds runs of fields for which `predicate` is true. // RunMap maps from fields that start each run to the number of fields in that // run. This is optimized for the common case that there are very few runs in @@ -4112,11 +4093,7 @@ } else { ABSL_DCHECK(GetFieldHasbitMode(field, options_) == HasbitMode::kTrueHasbit); - if (check_has_word && IsPOD(field)) { - generator.GenerateCopyConstructorCode(p); - } else { - generator.GenerateMergingCode(p); - } + generator.GenerateMergingCode(p); } }}}, R"cc(