forked from OSchip/llvm-project
Fix another crash on invalid code. In this case, handle ObjC categories (with no names)
that refer to an undefined class. llvm-svn: 96976
This commit is contained in:
parent
d09b921b7d
commit
514ff70d04
|
@ -599,22 +599,31 @@ ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc,
|
|||
SourceLocation EndProtoLoc) {
|
||||
ObjCCategoryDecl *CDecl = 0;
|
||||
ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName, ClassLoc);
|
||||
if (!CategoryName)
|
||||
|
||||
/// Check that class of this category is already completely declared.
|
||||
if (!IDecl || IDecl->isForwardDecl()) {
|
||||
// Create an invalid ObjCCategoryDecl to serve as context for
|
||||
// the enclosing method declarations. We mark the decl invalid
|
||||
// to make it clear that this isn't a valid AST.
|
||||
CDecl = ObjCCategoryDecl::Create(Context, CurContext, AtInterfaceLoc,
|
||||
ClassLoc, CategoryLoc, CategoryName);
|
||||
CDecl->setInvalidDecl();
|
||||
Diag(ClassLoc, diag::err_undef_interface) << ClassName;
|
||||
return DeclPtrTy::make(CDecl);
|
||||
}
|
||||
|
||||
if (!CategoryName) {
|
||||
// Class extensions require a special treatment. Use an existing one.
|
||||
// Note that 'getClassExtension()' can return NULL.
|
||||
CDecl = IDecl->getClassExtension();
|
||||
}
|
||||
|
||||
if (!CDecl) {
|
||||
CDecl = ObjCCategoryDecl::Create(Context, CurContext, AtInterfaceLoc, ClassLoc,
|
||||
CategoryLoc, CategoryName);
|
||||
CDecl = ObjCCategoryDecl::Create(Context, CurContext, AtInterfaceLoc,
|
||||
ClassLoc, CategoryLoc, CategoryName);
|
||||
// FIXME: PushOnScopeChains?
|
||||
CurContext->addDecl(CDecl);
|
||||
|
||||
/// Check that class of this category is already completely declared.
|
||||
if (!IDecl || IDecl->isForwardDecl()) {
|
||||
CDecl->setInvalidDecl();
|
||||
Diag(ClassLoc, diag::err_undef_interface) << ClassName;
|
||||
return DeclPtrTy::make(CDecl);
|
||||
}
|
||||
|
||||
CDecl->setClassInterface(IDecl);
|
||||
// Insert first use of class extension to the list of class's categories.
|
||||
if (!CategoryName)
|
||||
|
|
|
@ -73,3 +73,7 @@
|
|||
|
||||
@implementation MultipleCat_I // expected-warning {{incomplete implementation}}, expected-warning {{method definition for 'im0' not found}}
|
||||
@end
|
||||
|
||||
// <rdar://problem/7680391> - Handle nameless categories with no name that refer
|
||||
// to an undefined class
|
||||
@interface RDar7680391 () @end // expected-error{{cannot find interface declaration}}
|
||||
|
|
Loading…
Reference in New Issue