[ObjC] Breaking Change: Remove support for older generated code.

Remove runtime methods that support the Objective-C gencode from before the 3.22.x release.

PiperOrigin-RevId: 684462445
diff --git a/objectivec/GPBBootstrap.h b/objectivec/GPBBootstrap.h
index 78601c6..1d3c6be 100644
--- a/objectivec/GPBBootstrap.h
+++ b/objectivec/GPBBootstrap.h
@@ -118,10 +118,4 @@
 
 // Minimum runtime version supported for compiling/running against.
 // - Gets changed when support for the older generated code is dropped.
-#define GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION 30001
-
-// This is a legacy constant now frozen in time for old generated code. If
-// GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION ever gets moved above 30001 then
-// this should also change to break code compiled with an old runtime that
-// can't be supported any more.
-#define GOOGLE_PROTOBUF_OBJC_GEN_VERSION 30001
+#define GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION 30007
diff --git a/objectivec/GPBDescriptor.m b/objectivec/GPBDescriptor.m
index 25b48b0..0085b34 100644
--- a/objectivec/GPBDescriptor.m
+++ b/objectivec/GPBDescriptor.m
@@ -51,7 +51,6 @@
 // The addresses of these variables are used as keys for objc_getAssociatedObject.
 static const char kTextFormatExtraValueKey = 0;
 static const char kParentClassValueKey = 0;
-static const char kClassNameSuffixKey = 0;
 static const char kFileDescriptorCacheKey = 0;
 
 static NSArray *NewFieldsArrayForHasIndex(int hasIndex, NSArray *allMessageFields)
@@ -156,114 +155,6 @@
   return descriptor;
 }
 
-+ (instancetype)allocDescriptorForClass:(Class)messageClass
-                                   file:(GPBFileDescriptor *)file
-                                 fields:(void *)fieldDescriptions
-                             fieldCount:(uint32_t)fieldCount
-                            storageSize:(uint32_t)storageSize
-                                  flags:(GPBDescriptorInitializationFlags)flags {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30006,
-                           time_to_remove_this_old_version_shim);
-
-  BOOL fixClassRefs = (flags & GPBDescriptorInitializationFlag_UsesClassRefs) == 0;
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30003,
-                           time_to_remove_non_class_ref_support);
-
-  BOOL fixProto3Optional = (flags & GPBDescriptorInitializationFlag_Proto3OptionalKnown) == 0;
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30004,
-                           time_to_remove_proto3_optional_fallback);
-
-  BOOL fixClosedEnums = (flags & GPBDescriptorInitializationFlag_ClosedEnumSupportKnown) == 0;
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30005,
-                           time_to_remove_closed_enum_fallback);
-
-  if (fixClassRefs || fixProto3Optional || fixClosedEnums) {
-    BOOL fieldsIncludeDefault = (flags & GPBDescriptorInitializationFlag_FieldsWithDefault) != 0;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-    GPBFileSyntax fileSyntax = file.syntax;
-#pragma clang diagnostic pop
-
-    for (uint32_t i = 0; i < fieldCount; ++i) {
-      GPBMessageFieldDescription *coreDesc;
-      if (fieldsIncludeDefault) {
-        coreDesc = &((((GPBMessageFieldDescriptionWithDefault *)fieldDescriptions)[i]).core);
-      } else {
-        coreDesc = &(((GPBMessageFieldDescription *)fieldDescriptions)[i]);
-      }
-
-      if (fixClassRefs && GPBDataTypeIsMessage(coreDesc->dataType)) {
-        const char *className = coreDesc->dataTypeSpecific.className;
-        Class msgClass = objc_getClass(className);
-        NSAssert(msgClass, @"Class %s not defined", className);
-        coreDesc->dataTypeSpecific.clazz = msgClass;
-      }
-
-      if (fixProto3Optional) {
-        // If it was...
-        //  - proto3 syntax
-        //  - not repeated/map
-        //  - not in a oneof (negative has index)
-        //  - not a message (the flag doesn't make sense for messages)
-        BOOL clearOnZero = ((fileSyntax == GPBFileSyntaxProto3) &&
-                            ((coreDesc->flags & (GPBFieldRepeated | GPBFieldMapKeyMask)) == 0) &&
-                            (coreDesc->hasIndex >= 0) && !GPBDataTypeIsMessage(coreDesc->dataType));
-        if (clearOnZero) {
-          coreDesc->flags |= GPBFieldClearHasIvarOnZero;
-        }
-      }
-
-      if (fixClosedEnums) {
-        // NOTE: This isn't correct, it is using the syntax of the file that
-        // declared the field, not the syntax of the file that declared the
-        // enum; but for older generated code, that's all we have and that happens
-        // to be what the runtime was doing (even though it was wrong). This is
-        // only wrong in the rare cases an enum is declared in a proto3 syntax
-        // file but used for a field in the proto2 syntax file.
-        BOOL isClosedEnum =
-            (coreDesc->dataType == GPBDataTypeEnum && fileSyntax == GPBFileSyntaxProto2);
-        if (isClosedEnum) {
-          coreDesc->flags |= GPBFieldClosedEnum;
-        }
-      }
-    }
-    flags |= (GPBDescriptorInitializationFlag_UsesClassRefs |
-              GPBDescriptorInitializationFlag_Proto3OptionalKnown |
-              GPBDescriptorInitializationFlag_ClosedEnumSupportKnown);
-  }
-
-  GPBDescriptor *result = [self allocDescriptorForClass:messageClass
-                                            messageName:nil
-                                        fileDescription:NULL
-                                                 fields:fieldDescriptions
-                                             fieldCount:fieldCount
-                                            storageSize:storageSize
-                                                  flags:flags];
-  objc_setAssociatedObject(result, &kFileDescriptorCacheKey, file,
-                           OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-  return result;
-}
-
-+ (instancetype)allocDescriptorForClass:(Class)messageClass
-                              rootClass:(__unused Class)rootClass
-                                   file:(GPBFileDescriptor *)file
-                                 fields:(void *)fieldDescriptions
-                             fieldCount:(uint32_t)fieldCount
-                            storageSize:(uint32_t)storageSize
-                                  flags:(GPBDescriptorInitializationFlags)flags {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30006,
-                           time_to_remove_this_old_version_shim);
-  // The rootClass is no longer used, but it is passed as [ROOT class] to
-  // ensure it was started up during initialization also when the message
-  // scopes extensions.
-  return [self allocDescriptorForClass:messageClass
-                                  file:file
-                                fields:fieldDescriptions
-                            fieldCount:fieldCount
-                           storageSize:storageSize
-                                 flags:flags];
-}
-
 - (instancetype)initWithClass:(Class)messageClass
                   messageName:(NSString *)messageName
               fileDescription:(GPBFileDescription *)fileDescription
@@ -339,25 +230,6 @@
   objc_setAssociatedObject(self, &kParentClassValueKey, messageClass, OBJC_ASSOCIATION_ASSIGN);
 }
 
-- (void)setupContainingMessageClassName:(const char *)msgClassName {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30003,
-                           time_to_remove_this_old_version_shim);
-  // Note: Only fetch the class here, can't send messages to it because
-  // that could cause cycles back to this class within +initialize if
-  // two messages have each other in fields (i.e. - they build a graph).
-  Class clazz = objc_getClass(msgClassName);
-  NSAssert(clazz, @"Class %s not defined", msgClassName);
-  [self setupContainingMessageClass:clazz];
-}
-
-- (void)setupMessageClassNameSuffix:(NSString *)suffix {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30007,
-                           time_to_remove_this_old_version_shim);
-  if (suffix.length) {
-    objc_setAssociatedObject(self, &kClassNameSuffixKey, suffix, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-  }
-}
-
 - (NSString *)name {
   return NSStringFromClass(messageClass_);
 }
@@ -404,62 +276,10 @@
     return messageName_;
   }
 
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30007,
-                           time_to_remove_this_old_approach);
-  // NOTE: When this code path is removed, this also means this api can't return nil any more but
-  // that would be a breaking code change (not longer a Swift optional), so changing that will be
-  // harder.
-
-  NSString *className = NSStringFromClass(self.messageClass);
-  GPBFileDescriptor *file = self.file;
-  NSString *objcPrefix = file.objcPrefix;
-  if (objcPrefix && ![className hasPrefix:objcPrefix]) {
-    NSAssert(0, @"Class didn't have correct prefix? (%@ - %@)", className, objcPrefix);
-    return nil;
-  }
-
-  NSString *name = nil;
-  if (parent) {
-    NSString *parentClassName = NSStringFromClass(parent.messageClass);
-    // The generator will add _Class to avoid reserved words, drop it.
-    NSString *suffix = objc_getAssociatedObject(parent, &kClassNameSuffixKey);
-    if (suffix) {
-      if (![parentClassName hasSuffix:suffix]) {
-        NSAssert(0, @"ParentMessage class didn't have correct suffix? (%@ - %@)", className,
-                 suffix);
-        return nil;
-      }
-      parentClassName = [parentClassName substringToIndex:(parentClassName.length - suffix.length)];
-    }
-    NSString *parentPrefix = [parentClassName stringByAppendingString:@"_"];
-    if (![className hasPrefix:parentPrefix]) {
-      NSAssert(0, @"Class didn't have the correct parent name prefix? (%@ - %@)", parentPrefix,
-               className);
-      return nil;
-    }
-    name = [className substringFromIndex:parentPrefix.length];
-  } else {
-    name = [className substringFromIndex:objcPrefix.length];
-  }
-
-  // The generator will add _Class to avoid reserved words, drop it.
-  NSString *suffix = objc_getAssociatedObject(self, &kClassNameSuffixKey);
-  if (suffix) {
-    if (![name hasSuffix:suffix]) {
-      NSAssert(0, @"Message class didn't have correct suffix? (%@ - %@)", name, suffix);
-      return nil;
-    }
-    name = [name substringToIndex:(name.length - suffix.length)];
-  }
-
-  NSString *prefix = (parent != nil ? parent.fullName : file.package);
-  NSString *result;
-  if (prefix.length > 0) {
-    result = [NSString stringWithFormat:@"%@.%@", prefix, name];
-  } else {
-    result = name;
-  }
-  return result;
+#if defined(DEBUG) && DEBUG
+  NSAssert(NO, @"Missing messageName_");
+#endif
+  return nil;
 }
 
 - (GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber {
@@ -927,38 +747,6 @@
   return descriptor;
 }
 
-+ (instancetype)allocDescriptorForName:(NSString *)name
-                            valueNames:(const char *)valueNames
-                                values:(const int32_t *)values
-                                 count:(uint32_t)valueCount
-                          enumVerifier:(GPBEnumValidationFunc)enumVerifier {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30005,
-                           time_to_remove_this_old_version_shim);
-  return [self allocDescriptorForName:name
-                           valueNames:valueNames
-                               values:values
-                                count:valueCount
-                         enumVerifier:enumVerifier
-                                flags:GPBEnumDescriptorInitializationFlag_None];
-}
-
-+ (instancetype)allocDescriptorForName:(NSString *)name
-                            valueNames:(const char *)valueNames
-                                values:(const int32_t *)values
-                                 count:(uint32_t)valueCount
-                          enumVerifier:(GPBEnumValidationFunc)enumVerifier
-                   extraTextFormatInfo:(const char *)extraTextFormatInfo {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30005,
-                           time_to_remove_this_old_version_shim);
-  return [self allocDescriptorForName:name
-                           valueNames:valueNames
-                               values:values
-                                count:valueCount
-                         enumVerifier:enumVerifier
-                                flags:GPBEnumDescriptorInitializationFlag_None
-                  extraTextFormatInfo:extraTextFormatInfo];
-}
-
 - (instancetype)initWithName:(NSString *)name
                   valueNames:(const char *)valueNames
                       values:(const int32_t *)values
@@ -1186,27 +974,6 @@
   return self;
 }
 
-- (instancetype)initWithExtensionDescription:(GPBExtensionDescription *)desc {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30003,
-                           time_to_remove_this_old_version_shim);
-
-  const char *className = desc->messageOrGroupClass.name;
-  if (className) {
-    Class clazz = objc_lookUpClass(className);
-    NSAssert(clazz != Nil, @"Class %s not defined", className);
-    desc->messageOrGroupClass.clazz = clazz;
-  }
-
-  const char *extendedClassName = desc->extendedClass.name;
-  if (extendedClassName) {
-    Class clazz = objc_lookUpClass(extendedClassName);
-    NSAssert(clazz, @"Class %s not defined", extendedClassName);
-    desc->extendedClass.clazz = clazz;
-  }
-
-  return [self initWithExtensionDescription:desc usesClassRefs:YES];
-}
-
 - (void)dealloc {
   if ((description_->dataType == GPBDataTypeBytes) && !GPBExtensionIsRepeated(description_)) {
     [defaultValue_.valueData release];
diff --git a/objectivec/GPBDescriptor_PackagePrivate.h b/objectivec/GPBDescriptor_PackagePrivate.h
index 739b44d..2a110b0 100644
--- a/objectivec/GPBDescriptor_PackagePrivate.h
+++ b/objectivec/GPBDescriptor_PackagePrivate.h
@@ -209,31 +209,6 @@
 - (void)setupExtensionRanges:(const GPBExtensionRange *)ranges count:(int32_t)count;
 - (void)setupContainingMessageClass:(Class)msgClass;
 
-// Deprecated, these remain to support older versions of source generation.
-+ (instancetype)allocDescriptorForClass:(Class)messageClass
-                                   file:(GPBFileDescriptor *)file
-                                 fields:(void *)fieldDescriptions
-                             fieldCount:(uint32_t)fieldCount
-                            storageSize:(uint32_t)storageSize
-                                  flags:(GPBDescriptorInitializationFlags)flags
-    __attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                              "Support for this version will go away in the future.")));
-+ (instancetype)allocDescriptorForClass:(Class)messageClass
-                              rootClass:(Class)rootClass
-                                   file:(GPBFileDescriptor *)file
-                                 fields:(void *)fieldDescriptions
-                             fieldCount:(uint32_t)fieldCount
-                            storageSize:(uint32_t)storageSize
-                                  flags:(GPBDescriptorInitializationFlags)flags
-    __attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                              "Support for this version will go away in the future.")));
-- (void)setupContainingMessageClassName:(const char *)msgClassName
-    __attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                              "Support for this version will go away in the future.")));
-- (void)setupMessageClassNameSuffix:(NSString *)suffix
-    __attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                              "Support for this version will go away in the future.")));
-
 @end
 
 @interface GPBFileDescriptor ()
@@ -285,22 +260,6 @@
                                  flags:(GPBEnumDescriptorInitializationFlags)flags
                    extraTextFormatInfo:(const char *)extraTextFormatInfo;
 
-// Deprecated, these remain to support older versions of source generation.
-+ (instancetype)allocDescriptorForName:(NSString *)name
-                            valueNames:(const char *)valueNames
-                                values:(const int32_t *)values
-                                 count:(uint32_t)valueCount
-                          enumVerifier:(GPBEnumValidationFunc)enumVerifier
-    __attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                              "Support for this version will go away in the future.")));
-+ (instancetype)allocDescriptorForName:(NSString *)name
-                            valueNames:(const char *)valueNames
-                                values:(const int32_t *)values
-                                 count:(uint32_t)valueCount
-                          enumVerifier:(GPBEnumValidationFunc)enumVerifier
-                   extraTextFormatInfo:(const char *)extraTextFormatInfo
-    __attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                              "Support for this version will go away in the future.")));
 @end
 
 @interface GPBExtensionDescriptor () {
@@ -318,10 +277,6 @@
 // description has to be long lived, it is held as a raw pointer.
 - (instancetype)initWithExtensionDescription:(GPBExtensionDescription *)desc
                                usesClassRefs:(BOOL)usesClassRefs;
-// Deprecated. Calls above with `usesClassRefs = NO`
-- (instancetype)initWithExtensionDescription:(GPBExtensionDescription *)desc
-    __attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                              "Support for this version will go away in the future.")));
 
 - (NSComparisonResult)compareByFieldNumber:(GPBExtensionDescriptor *)other;
 @end
diff --git a/objectivec/GPBMessage_PackagePrivate.h b/objectivec/GPBMessage_PackagePrivate.h
index 58649c4..b46b647 100644
--- a/objectivec/GPBMessage_PackagePrivate.h
+++ b/objectivec/GPBMessage_PackagePrivate.h
@@ -11,12 +11,6 @@
 
 #import "GPBMessage.h"
 
-// TODO: Remove this import. Older generated code use the OSAtomic* apis,
-// so anyone that hasn't regenerated says building by having this. After
-// enough time has passed, this likely can be removed as folks should have
-// regenerated.
-#import <libkern/OSAtomic.h>
-
 #import "GPBBootstrap.h"
 
 typedef struct GPBMessage_Storage {
diff --git a/objectivec/GPBUtilities.m b/objectivec/GPBUtilities.m
index cd62f29..7240603 100644
--- a/objectivec/GPBUtilities.m
+++ b/objectivec/GPBUtilities.m
@@ -210,14 +210,6 @@
                        @" supports back to %d!",
                        objcRuntimeVersion, GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION];
   }
-#if defined(DEBUG) && DEBUG
-  if (objcRuntimeVersion < GOOGLE_PROTOBUF_OBJC_VERSION) {
-    // This is a version we haven't generated for yet.
-    NSLog(@"WARNING: Code from generated Objective-C proto from an older version of the library is "
-          @"being used. Please regenerate with the current version as the code will stop working "
-          @"in a future release.");
-  }
-#endif
 }
 
 void GPBRuntimeMatchFailure(void) {
@@ -227,20 +219,6 @@
                      GOOGLE_PROTOBUF_OBJC_VERSION];
 }
 
-// This api is no longer used for version checks. 30001 is the last version
-// using this old versioning model. When that support is removed, this function
-// can be removed (along with the declaration in GPBUtilities_PackagePrivate.h).
-void GPBCheckRuntimeVersionInternal(int32_t version) {
-  GPBInternalCompileAssert(GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION <= 30001,
-                           time_to_remove_this_old_version_shim);
-  if (version != GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION) {
-    [NSException raise:NSInternalInconsistencyException
-                format:@"Linked to ProtocolBuffer runtime version %d,"
-                       @" but code compiled with version %d!",
-                       GOOGLE_PROTOBUF_OBJC_GEN_VERSION, version];
-  }
-}
-
 BOOL GPBMessageHasFieldNumberSet(GPBMessage *self, uint32_t fieldNumber) {
   GPBDescriptor *descriptor = [self descriptor];
   GPBFieldDescriptor *field = [descriptor fieldWithNumber:fieldNumber];
diff --git a/objectivec/GPBUtilities_PackagePrivate.h b/objectivec/GPBUtilities_PackagePrivate.h
index e8c8cb5..4554123 100644
--- a/objectivec/GPBUtilities_PackagePrivate.h
+++ b/objectivec/GPBUtilities_PackagePrivate.h
@@ -50,19 +50,6 @@
 // is just a final safety net to prevent otherwise hard to diagnose errors.
 void GPBRuntimeMatchFailure(void);
 
-// Legacy version of the checks, remove when GOOGLE_PROTOBUF_OBJC_GEN_VERSION
-// goes away (see more info in GPBBootstrap.h).
-void GPBCheckRuntimeVersionInternal(int32_t version)
-    __attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                              "Support for this version will go away in the future.")));
-__attribute__((deprecated("Please use a newer version of protoc to regenerate your sources. "
-                          "Support for this version will go away in the future."))) GPB_INLINE void
-GPBDebugCheckRuntimeVersion(void) {
-#if defined(DEBUG) && DEBUG
-  GPBCheckRuntimeVersionInternal(GOOGLE_PROTOBUF_OBJC_GEN_VERSION);
-#endif
-}
-
 // Conversion functions for de/serializing floating point types.
 
 GPB_INLINE int64_t GPBConvertDoubleToInt64(double v) {
diff --git a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
index ade80fa..0546af6 100644
--- a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
@@ -33,7 +33,6 @@
 		8BBEA4BB147C729200C4ADB7 /* libProtocolBuffers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7461B52E0F94FAF800A0C422 /* libProtocolBuffers.a */; };
 		8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */; };
 		8BF8193514A0DDA600A2C982 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
-		8BFF9D1A23AD582300E63E32 /* GPBMessageTests+ClassNames.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BFF9D1923AD582200E63E32 /* GPBMessageTests+ClassNames.m */; };
 		F401DC2D1A8D444600FCC765 /* GPBArray.m in Sources */ = {isa = PBXBuildFile; fileRef = F401DC2B1A8D444600FCC765 /* GPBArray.m */; };
 		F401DC331A8E5C0200FCC765 /* GPBArrayTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F401DC321A8E5C0200FCC765 /* GPBArrayTests.m */; };
 		F40EE4AB206BF8B90071091A /* GPBCompileTest01.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE488206BF8B00071091A /* GPBCompileTest01.m */; };
@@ -168,7 +167,6 @@
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
-		8BFF9D1923AD582200E63E32 /* GPBMessageTests+ClassNames.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+ClassNames.m"; sourceTree = "<group>"; };
 		F401DC2A1A8D444600FCC765 /* GPBArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBArray.h; sourceTree = "<group>"; };
 		F401DC2B1A8D444600FCC765 /* GPBArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArray.m; sourceTree = "<group>"; };
 		F401DC321A8E5C0200FCC765 /* GPBArrayTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArrayTests.m; sourceTree = "<group>"; };
@@ -498,7 +496,6 @@
 				F4353D321AC06F10005A6198 /* GPBDictionaryTests+UInt64.m */,
 				F4584D7E1ECCB38900803AB6 /* GPBExtensionRegistryTest.m */,
 				7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */,
-				8BFF9D1923AD582200E63E32 /* GPBMessageTests+ClassNames.m */,
 				F4487C821AAF6AB300531423 /* GPBMessageTests+Merge.m */,
 				F4487C741AADF7F500531423 /* GPBMessageTests+Runtime.m */,
 				F4487C7E1AAF62CD00531423 /* GPBMessageTests+Serialization.m */,
@@ -780,7 +777,6 @@
 				F4353D1D1AB8822D005A6198 /* GPBDescriptorTests.m in Sources */,
 				8B4248BB1A8C256A00BC1EC6 /* GPBSwiftTests.swift in Sources */,
 				F4584D821ECCB52A00803AB6 /* GPBExtensionRegistryTest.m in Sources */,
-				8BFF9D1A23AD582300E63E32 /* GPBMessageTests+ClassNames.m in Sources */,
 				5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */,
 				F4487C751AADF7F500531423 /* GPBMessageTests+Runtime.m in Sources */,
 				F40EE4AC206BF8B90071091A /* GPBCompileTest02.m in Sources */,
diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
index ed3f156..0add85c 100644
--- a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
@@ -34,7 +34,6 @@
 		8BBEA4BB147C729200C4ADB7 /* libProtocolBuffers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7461B52E0F94FAF800A0C422 /* libProtocolBuffers.a */; };
 		8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */; };
 		8BF8193514A0DDA600A2C982 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
-		8BFF9D1C23AD593C00E63E32 /* GPBMessageTests+ClassNames.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BFF9D1B23AD593B00E63E32 /* GPBMessageTests+ClassNames.m */; };
 		F401DC351A8E5C6F00FCC765 /* GPBArrayTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */; };
 		F40EE4F0206BF91E0071091A /* GPBCompileTest01.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4CD206BF9170071091A /* GPBCompileTest01.m */; };
 		F40EE4F1206BF91E0071091A /* GPBCompileTest02.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4C6206BF9170071091A /* GPBCompileTest02.m */; };
@@ -170,7 +169,6 @@
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
-		8BFF9D1B23AD593B00E63E32 /* GPBMessageTests+ClassNames.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+ClassNames.m"; sourceTree = "<group>"; };
 		F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArrayTests.m; sourceTree = "<group>"; };
 		F40EE4C2206BF9160071091A /* GPBCompileTest08.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest08.m; sourceTree = "<group>"; };
 		F40EE4C3206BF9160071091A /* GPBCompileTest04.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest04.m; sourceTree = "<group>"; };
@@ -503,7 +501,6 @@
 				F4353D401AC06F31005A6198 /* GPBDictionaryTests+UInt64.m */,
 				F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */,
 				7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */,
-				8BFF9D1B23AD593B00E63E32 /* GPBMessageTests+ClassNames.m */,
 				F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */,
 				F4487C761AADF84900531423 /* GPBMessageTests+Runtime.m */,
 				F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */,
@@ -785,7 +782,6 @@
 				F4B51B1C1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */,
 				8B4248B41A8BD96E00BC1EC6 /* GPBSwiftTests.swift in Sources */,
 				F4584D831ECCB53600803AB6 /* GPBExtensionRegistryTest.m in Sources */,
-				8BFF9D1C23AD593C00E63E32 /* GPBMessageTests+ClassNames.m in Sources */,
 				5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */,
 				F4487C771AADF84900531423 /* GPBMessageTests+Runtime.m in Sources */,
 				F40EE4F1206BF91E0071091A /* GPBCompileTest02.m in Sources */,
diff --git a/objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj
index 76f20db..065b2f7 100644
--- a/objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj
@@ -34,7 +34,6 @@
 		8BBEA4BB147C729200C4ADB7 /* libProtocolBuffers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7461B52E0F94FAF800A0C422 /* libProtocolBuffers.a */; };
 		8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */; };
 		8BF8193514A0DDA600A2C982 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
-		8BFF9D1E23AD599400E63E32 /* GPBMessageTests+ClassNames.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BFF9D1D23AD599400E63E32 /* GPBMessageTests+ClassNames.m */; };
 		F401DC351A8E5C6F00FCC765 /* GPBArrayTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */; };
 		F40EE4F0206BF91E0071091A /* GPBCompileTest01.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4CD206BF9170071091A /* GPBCompileTest01.m */; };
 		F40EE4F1206BF91E0071091A /* GPBCompileTest02.m in Sources */ = {isa = PBXBuildFile; fileRef = F40EE4C6206BF9170071091A /* GPBCompileTest02.m */; };
@@ -171,7 +170,6 @@
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
-		8BFF9D1D23AD599400E63E32 /* GPBMessageTests+ClassNames.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GPBMessageTests+ClassNames.m"; sourceTree = "<group>"; };
 		F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArrayTests.m; sourceTree = "<group>"; };
 		F40EE4C2206BF9160071091A /* GPBCompileTest08.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest08.m; sourceTree = "<group>"; };
 		F40EE4C3206BF9160071091A /* GPBCompileTest04.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBCompileTest04.m; sourceTree = "<group>"; };
@@ -504,7 +502,6 @@
 				F4353D401AC06F31005A6198 /* GPBDictionaryTests+UInt64.m */,
 				F4584D801ECCB39E00803AB6 /* GPBExtensionRegistryTest.m */,
 				7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */,
-				8BFF9D1D23AD599400E63E32 /* GPBMessageTests+ClassNames.m */,
 				F4487C841AAF6AC500531423 /* GPBMessageTests+Merge.m */,
 				F4487C761AADF84900531423 /* GPBMessageTests+Runtime.m */,
 				F4487C801AAF62FC00531423 /* GPBMessageTests+Serialization.m */,
@@ -787,7 +784,6 @@
 				F4B51B1C1BBC5C7100744318 /* GPBObjectiveCPlusPlusTest.mm in Sources */,
 				8B4248B41A8BD96E00BC1EC6 /* GPBSwiftTests.swift in Sources */,
 				F4584D831ECCB53600803AB6 /* GPBExtensionRegistryTest.m in Sources */,
-				8BFF9D1E23AD599400E63E32 /* GPBMessageTests+ClassNames.m in Sources */,
 				5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */,
 				F4487C771AADF84900531423 /* GPBMessageTests+Runtime.m in Sources */,
 				F40EE4F1206BF91E0071091A /* GPBCompileTest02.m in Sources */,
diff --git a/objectivec/Tests/GPBMessageTests+ClassNames.m b/objectivec/Tests/GPBMessageTests+ClassNames.m
deleted file mode 100644
index e1b49d8..0000000
--- a/objectivec/Tests/GPBMessageTests+ClassNames.m
+++ /dev/null
@@ -1,145 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2015 Google Inc.  All rights reserved.
-//
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file or at
-// https://developers.google.com/open-source/licenses/bsd
-
-#import <objc/runtime.h>
-
-#import "GPBDescriptor_PackagePrivate.h"
-#import "GPBExtensionRegistry.h"
-#import "GPBMessage.h"
-#import "GPBRootObject_PackagePrivate.h"
-#import "GPBTestUtilities.h"
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-
-// Support classes for tests using old class name (vs classrefs) interfaces.
-GPB_FINAL @interface MessageLackingClazzRoot : GPBRootObject
-@end
-
-@interface MessageLackingClazzRoot (DynamicMethods)
-+ (GPBExtensionDescriptor *)ext1;
-@end
-
-GPB_FINAL @interface MessageLackingClazz : GPBMessage
-@property(copy, nonatomic) NSString *foo;
-@end
-
-@implementation MessageLackingClazz
-
-@dynamic foo;
-
-typedef struct MessageLackingClazz_storage_ {
-  uint32_t _has_storage_[1];
-  NSString *foo;
-} MessageLackingClazz_storage_;
-
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-        {
-            .name = "foo",
-            .dataTypeSpecific.className = "NSString",
-            .number = 1,
-            .hasIndex = 0,
-            .offset = (uint32_t)offsetof(MessageLackingClazz_storage_, foo),
-            .flags = (GPBFieldFlags)(GPBFieldOptional),
-            .dataType = GPBDataTypeMessage,
-        },
-    };
-    GPBFileDescriptor *desc =
-        [[[GPBFileDescriptor alloc] initWithPackage:@"test"
-                                         objcPrefix:@"TEST"
-                                             syntax:GPBFileSyntaxProto3] autorelease];
-
-    // GPBDescriptorInitializationFlag_UsesClassRefs intentionally not set here
-    descriptor = [GPBDescriptor
-        allocDescriptorForClass:[MessageLackingClazz class]
-                      rootClass:[MessageLackingClazzRoot class]
-                           file:desc
-                         fields:fields
-                     fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
-                    storageSize:sizeof(MessageLackingClazz_storage_)
-                          flags:GPBDescriptorInitializationFlag_None];
-    [descriptor setupContainingMessageClassName:"MessageLackingClazz"];
-  }
-  return descriptor;
-}
-@end
-
-@implementation MessageLackingClazzRoot
-
-+ (GPBExtensionRegistry *)extensionRegistry {
-  // This is called by +initialize so there is no need to worry
-  // about thread safety and initialization of registry.
-  static GPBExtensionRegistry *registry = nil;
-  if (!registry) {
-    registry = [[GPBExtensionRegistry alloc] init];
-    static GPBExtensionDescription descriptions[] = {
-        {
-            .defaultValue.valueMessage = NULL,
-            .singletonName = "MessageLackingClazzRoot_ext1",
-            .extendedClass.name = "MessageLackingClazz",
-            .messageOrGroupClass.name = "MessageLackingClazz",
-            .enumDescriptorFunc = NULL,
-            .fieldNumber = 1,
-            .dataType = GPBDataTypeMessage,
-            // GPBExtensionUsesClazz Intentionally not set
-            .options = 0,
-        },
-    };
-    for (size_t i = 0; i < sizeof(descriptions) / sizeof(descriptions[0]); ++i) {
-      // Intentionall using `-initWithExtensionDescription:` and not `
-      // -initWithExtensionDescription:usesClassRefs:` to test backwards
-      // compatibility
-      GPBExtensionDescriptor *extension =
-          [[GPBExtensionDescriptor alloc] initWithExtensionDescription:&descriptions[i]];
-      [registry addExtension:extension];
-      [self globallyRegisterExtension:extension];
-      [extension release];
-    }
-    // None of the imports (direct or indirect) defined extensions, so no need to add
-    // them to this registry.
-  }
-  return registry;
-}
-@end
-
-#pragma clang diagnostic pop
-
-@interface MessageClassNameTests : GPBTestCase
-@end
-
-@implementation MessageClassNameTests
-
-- (void)testClassNameSupported {
-  // This tests backwards compatibility to make sure we support older sources
-  // that use class names instead of references.
-  GPBDescriptor *desc = [MessageLackingClazz descriptor];
-  GPBFieldDescriptor *fieldDesc = [desc fieldWithName:@"foo"];
-  XCTAssertEqualObjects(fieldDesc.msgClass, [NSString class]);
-}
-
-- (void)testSetupContainingMessageClassNameSupported {
-  // This tests backwards compatibility to make sure we support older sources
-  // that use class names instead of references.
-  GPBDescriptor *desc = [MessageLackingClazz descriptor];
-  GPBDescriptor *container = [desc containingType];
-  XCTAssertEqualObjects(container.messageClass, [MessageLackingClazz class]);
-}
-
-- (void)testExtensionsNameSupported {
-  // This tests backwards compatibility to make sure we support older sources
-  // that use class names instead of references.
-  GPBExtensionDescriptor *desc = [MessageLackingClazzRoot ext1];
-  Class containerClass = [desc containingMessageClass];
-  XCTAssertEqualObjects(containerClass, [MessageLackingClazz class]);
-  Class msgClass = [desc msgClass];
-  XCTAssertEqualObjects(msgClass, [MessageLackingClazz class]);
-}
-
-@end