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
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index f64ff97..426cca0 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -220,11 +220,13 @@
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 @@
CGF.getContext().VoidTy,
method->getSelector(),
iface,
- /*is category*/ false,
+ isCategory,
self,
/*is class msg*/ false,
args,
diff --git a/test/CodeGenObjC/arc.m b/test/CodeGenObjC/arc.m
index 2431866..407b3eb 100644
--- a/test/CodeGenObjC/arc.m
+++ b/test/CodeGenObjC/arc.m
@@ -1542,3 +1542,13 @@
// 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*)*)(