ObjcInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName);
ObjcCategoryDecl *CDecl = new ObjcCategoryDecl(AtInterfaceLoc, NumProtoRefs,
CategoryName);
+ bool err = false;
CDecl->setClassInterface(IDecl);
/// Check that class of this category is already completely declared.
- if (!IDecl || IDecl->isForwardDecl())
+ if (!IDecl || IDecl->isForwardDecl()) {
Diag(ClassLoc, diag::err_undef_interface, ClassName->getName());
+ err = true;
+ }
else {
/// Check for duplicate interface declaration for this category
ObjcCategoryDecl *CDeclChain;
if (CDeclChain->getIdentifier() == CategoryName) {
Diag(CategoryLoc, diag::err_dup_category_def, ClassName->getName(),
CategoryName->getName());
+ err = true;
break;
}
}
for (unsigned int i = 0; i != NumProtoRefs; i++) {
ObjcProtocolDecl* RefPDecl = getObjCProtocolDecl(S, ProtoRefNames[i],
CategoryLoc);
- if (!RefPDecl || RefPDecl->isForwardDecl())
+ if (!RefPDecl || RefPDecl->isForwardDecl()) {
Diag(CategoryLoc, diag::err_undef_protocolref,
ProtoRefNames[i]->getName(),
CategoryName->getName());
+ err = true;
+ }
CDecl->setCatReferencedProtocols((int)i, RefPDecl);
}
- return CDecl;
+ return err ? 0 : CDecl;
}
/// ActOnStartCategoryImplementation - Perform semantic checks on the