From: Fariborz Jahanian Date: Tue, 13 Nov 2007 22:09:49 +0000 (+0000) Subject: Fixed a rewrite of metadata bug when category implementation has no matching interface. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bac97d43c9552ac0e084bb81fb7404908f1e9970;p=clang 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 a270970c1b..ff9bf2f924 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -1221,7 +1221,6 @@ void RewriteTest::RewriteObjcMethodsMetaData(ObjcMethodDecl *const*Methods, 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 @@ void RewriteTest::RewriteObjcCategoryImplDecl(ObjcCategoryImplDecl *IDecl, 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 @@ void RewriteTest::RewriteObjcCategoryImplDecl(ObjcCategoryImplDecl *IDecl, "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 @@ void RewriteTest::RewriteObjcCategoryImplDecl(ObjcCategoryImplDecl *IDecl, 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 0000000000..134debf6f8 --- /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