Prepare `MessageLite::GetTypeName` to be upgraded to return
`absl::string_view`.
This is a modernization of the API and performance improvement for all callers.

Currently gated behind opt-in macro
`PROTOBUF_TEMPORARY_ENABLE_STRING_VIEW_RETURN_TYPE` for users to test and prevent
issues when the breaking change happens.

PiperOrigin-RevId: 667616632
diff --git a/src/google/protobuf/lite_unittest.cc b/src/google/protobuf/lite_unittest.cc
index be4c428..2999f7e 100644
--- a/src/google/protobuf/lite_unittest.cc
+++ b/src/google/protobuf/lite_unittest.cc
@@ -1363,9 +1363,10 @@
 TEST(LiteTest, DynamicCastMessageInvalidReferenceType) {
   CastType1 test_type_1;
   const MessageLite& test_type_1_pointer_const_ref = test_type_1;
-  ASSERT_DEATH(DynamicCastMessage<CastType2>(test_type_1_pointer_const_ref),
-               "Cannot downcast " + test_type_1.GetTypeName() + " to " +
-                   CastType2::default_instance().GetTypeName());
+  ASSERT_DEATH(
+      DynamicCastMessage<CastType2>(test_type_1_pointer_const_ref),
+      absl::StrCat("Cannot downcast ", test_type_1.GetTypeName(), " to ",
+                   CastType2::default_instance().GetTypeName()));
 }
 #endif  // GTEST_HAS_DEATH_TEST
 
@@ -1396,9 +1397,10 @@
 
   MessageLite* test_type_1_pointer = &test_type_1;
 
-  ASSERT_DEBUG_DEATH(DownCastMessage<CastType2>(test_type_1_pointer),
-                     "Cannot downcast " + test_type_1.GetTypeName() + " to " +
-                         CastType2::default_instance().GetTypeName());
+  ASSERT_DEBUG_DEATH(
+      DownCastMessage<CastType2>(test_type_1_pointer),
+      absl::StrCat("Cannot downcast ", test_type_1.GetTypeName(), " to ",
+                   CastType2::default_instance().GetTypeName()));
 }
 
 TEST(LiteTest, DownCastMessageInvalidReferenceType) {
@@ -1406,9 +1408,10 @@
 
   MessageLite& test_type_1_pointer = test_type_1;
 
-  ASSERT_DEBUG_DEATH(DownCastMessage<CastType2>(test_type_1_pointer),
-                     "Cannot downcast " + test_type_1.GetTypeName() + " to " +
-                         CastType2::default_instance().GetTypeName());
+  ASSERT_DEBUG_DEATH(
+      DownCastMessage<CastType2>(test_type_1_pointer),
+      absl::StrCat("Cannot downcast ", test_type_1.GetTypeName(), " to ",
+                   CastType2::default_instance().GetTypeName()));
 }
 #endif  // GTEST_HAS_DEATH_TEST
 
diff --git a/src/google/protobuf/message_lite.cc b/src/google/protobuf/message_lite.cc
index b188a9e..132bdc6 100644
--- a/src/google/protobuf/message_lite.cc
+++ b/src/google/protobuf/message_lite.cc
@@ -74,8 +74,8 @@
   return internal::TcParser::ParseLoop(this, ptr, ctx, GetTcParseTable());
 }
 
-std::string MessageLite::GetTypeName() const {
-  return std::string(TypeId::Get(*this).name());
+internal::GetTypeNameReturnType MessageLite::GetTypeName() const {
+  return internal::GetTypeNameReturnType(TypeId::Get(*this).name());
 }
 
 absl::string_view TypeId::name() const {
diff --git a/src/google/protobuf/message_lite.h b/src/google/protobuf/message_lite.h
index 058b114..c811e04 100644
--- a/src/google/protobuf/message_lite.h
+++ b/src/google/protobuf/message_lite.h
@@ -190,6 +190,12 @@
   return static_cast<int>(size);
 }
 
+#if defined(PROTOBUF_FUTURE_STRING_VIEW_RETURN_TYPE)
+using GetTypeNameReturnType = absl::string_view;
+#else
+using GetTypeNameReturnType = std::string;
+#endif
+
 // Default empty string object. Don't use this directly. Instead, call
 // GetEmptyString() to get the reference. This empty string is aligned with a
 // minimum alignment of 8 bytes to match the requirement of ArenaStringPtr.
@@ -240,7 +246,7 @@
   // Basic Operations ------------------------------------------------
 
   // Get the name of this message type, e.g. "foo.bar.BazProto".
-  std::string GetTypeName() const;
+  internal::GetTypeNameReturnType GetTypeName() const;
 
   // Construct a new instance of the same type.  Ownership is passed to the
   // caller.
diff --git a/src/google/protobuf/message_unittest.inc b/src/google/protobuf/message_unittest.inc
index dfd6fe5..e555c21 100644
--- a/src/google/protobuf/message_unittest.inc
+++ b/src/google/protobuf/message_unittest.inc
@@ -792,10 +792,11 @@
 TEST(MESSAGE_TEST_NAME, DynamicCastMessageInvalidReferenceType) {
   UNITTEST::TestAllTypes test_all_types;
   const MessageLite& test_all_types_pointer_const_ref = test_all_types;
-  ASSERT_DEATH(DynamicCastMessage<UNITTEST::TestRequired>(
-                   test_all_types_pointer_const_ref),
-               "Cannot downcast " + test_all_types.GetTypeName() + " to " +
-                   UNITTEST::TestRequired::default_instance().GetTypeName());
+  ASSERT_DEATH(
+      DynamicCastMessage<UNITTEST::TestRequired>(
+          test_all_types_pointer_const_ref),
+      absl::StrCat("Cannot downcast ", test_all_types.GetTypeName(), " to ",
+                   UNITTEST::TestRequired::default_instance().GetTypeName()));
 }
 
 TEST(MESSAGE_TEST_NAME, DownCastMessageValidType) {
@@ -829,8 +830,8 @@
 
   ASSERT_DEBUG_DEATH(
       DownCastMessage<UNITTEST::TestRequired>(test_all_types_pointer),
-      "Cannot downcast " + test_all_types.GetTypeName() + " to " +
-          UNITTEST::TestRequired::default_instance().GetTypeName());
+      absl::StrCat("Cannot downcast ", test_all_types.GetTypeName(), " to ",
+                   UNITTEST::TestRequired::default_instance().GetTypeName()));
 }
 
 TEST(MESSAGE_TEST_NAME, DownCastMessageInvalidReferenceType) {
@@ -840,8 +841,8 @@
 
   ASSERT_DEBUG_DEATH(
       DownCastMessage<UNITTEST::TestRequired>(test_all_types_ref),
-      "Cannot downcast " + test_all_types.GetTypeName() + " to " +
-          UNITTEST::TestRequired::default_instance().GetTypeName());
+      absl::StrCat("Cannot downcast ", test_all_types.GetTypeName(), " to ",
+                   UNITTEST::TestRequired::default_instance().GetTypeName()));
 }
 
 TEST(MESSAGE_TEST_NAME, MessageDebugStringMatchesBehindPointerAndLitePointer) {