Fixed a rewrite of metadata bug when category implementation has no matching interface.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44072 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index a270970..ff9bf2f 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -1221,7 +1221,6 @@
     Result += MethodInternalNames[Methods[0]];
     Result += "}\n";
     for (int i = 1; i < NumMethods; i++) {
-      // TODO: Need method address as 3rd initializer.
       Result += "\t  ,{(SEL)\"";
       Result += Methods[i]->getSelector().getName().c_str();
       std::string MethodTypeString;
@@ -1415,8 +1414,7 @@
        CDecl = CDecl->getNextClassCategory())
     if (CDecl->getIdentifier() == IDecl->getIdentifier())
       break;
-  assert(CDecl && "RewriteObjcCategoryImplDecl - bad category");
-  
+    
   char *FullCategoryName = (char*)alloca(
     strlen(ClassDecl->getName()) + strlen(IDecl->getName()) + 2);
   sprintf(FullCategoryName, "%s_%s", ClassDecl->getName(), IDecl->getName());
@@ -1434,10 +1432,12 @@
                              "CATEGORY_", FullCategoryName, Result);
   
   // Protocols referenced in class declaration?
-  RewriteObjcProtocolsMetaData(CDecl->getReferencedProtocols(),
-                               CDecl->getNumReferencedProtocols(),
-                               "CATEGORY",
-                               FullCategoryName, Result);
+  // Null CDecl is case of a category implementation with no category interface
+  if (CDecl)
+    RewriteObjcProtocolsMetaData(CDecl->getReferencedProtocols(),
+                                 CDecl->getNumReferencedProtocols(),
+                                 "CATEGORY",
+                                 FullCategoryName, Result);
   
   /* struct _objc_category {
    char *category_name;
@@ -1490,7 +1490,7 @@
   else
     Result += "\t, 0\n";
   
-  if (CDecl->getNumReferencedProtocols() > 0) {
+  if (CDecl && CDecl->getNumReferencedProtocols() > 0) {
     Result += "\t, (struct _objc_protocol_list *)&_OBJC_CATEGORY_PROTOCOLS_"; 
     Result += FullCategoryName;
     Result += "\n";
diff --git a/test/Sema/metadata-test-1.m b/test/Sema/metadata-test-1.m
new file mode 100644
index 0000000..134debf
--- /dev/null
+++ b/test/Sema/metadata-test-1.m
@@ -0,0 +1,12 @@
+// RUN: clang -rewrite-test %s
+
+@interface Intf 
+@end
+
+@implementation Intf(Category)
+- (void) CatMeth {}
+@end
+
+@implementation Another
+- (void) CatMeth {}
+@end