Don't crash if defining -dealloc in a category.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135054 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
John McCall 2011-07-13 18:26:47 +00:00
Родитель 48218c60d6
Коммит 799d34e950
2 изменённых файлов: 15 добавлений и 3 удалений

Просмотреть файл

@ -220,11 +220,13 @@ namespace {
struct FinishARCDealloc : EHScopeStack::Cleanup {
void Emit(CodeGenFunction &CGF, Flags flags) {
const ObjCMethodDecl *method = cast<ObjCMethodDecl>(CGF.CurCodeDecl);
const ObjCImplementationDecl *impl
= cast<ObjCImplementationDecl>(method->getDeclContext());
const ObjCImplDecl *impl = cast<ObjCImplDecl>(method->getDeclContext());
const ObjCInterfaceDecl *iface = impl->getClassInterface();
if (!iface->getSuperClass()) return;
bool isCategory = isa<ObjCCategoryImplDecl>(impl);
// Call [super dealloc] if we have a superclass.
llvm::Value *self = CGF.LoadObjCSelf();
@ -233,7 +235,7 @@ struct FinishARCDealloc : EHScopeStack::Cleanup {
CGF.getContext().VoidTy,
method->getSelector(),
iface,
/*is category*/ false,
isCategory,
self,
/*is class msg*/ false,
args,

Просмотреть файл

@ -1542,3 +1542,13 @@ void test54(int first, ...) {
// CHECK: call void @objc_release
// CHECK: ret void
}
// PR10228
@interface Test55Base @end
@interface Test55 : Test55Base @end
@implementation Test55 (Category)
- (void) dealloc {}
@end
// CHECK: define internal void @"\01-[Test55(Category) dealloc]"(
// CHECK-NOT: ret
// CHECK: call void bitcast (i8* ({{%.*}}*, i8*, ...)* @objc_msgSendSuper2 to void ({{%.*}}*, i8*)*)(