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(