From ab3d509bc45218c278454962ff644bb13d18ce1a Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis <akyrtzi@gmail.com> Date: Sat, 27 Apr 2013 00:10:12 +0000 Subject: [PATCH] Fix an assertion hit in Sema::CheckObjCMethodOverrides. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@180651 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclObjC.cpp | 10 ++++++---- test/SemaObjC/protocol-lookup-2.m | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 271c7fcf36e..41f96833df4 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -2077,9 +2077,10 @@ bool Sema::MatchTwoMethodDeclarations(const ObjCMethodDecl *left, void Sema::addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method) { // Record at the head of the list whether there were 0, 1, or >= 2 methods // inside categories. - if (isa<ObjCCategoryDecl>(Method->getDeclContext())) - if (List->getBits() < 2) - List->setBits(List->getBits()+1); + if (ObjCCategoryDecl * + CD = dyn_cast<ObjCCategoryDecl>(Method->getDeclContext())) + if (!CD->IsClassExtension() && List->getBits() < 2) + List->setBits(List->getBits()+1); // If the list is empty, make it a singleton list. if (List->Method == 0) { @@ -2828,7 +2829,8 @@ void Sema::CheckObjCMethodOverrides(ObjCMethodDecl *ObjCMethod, for (OverrideSearch::iterator OI= overrides.begin(), OE= overrides.end(); OI!=OE; ++OI) { ObjCMethodDecl *SuperOverridden = *OI; - if (CurrentClass != SuperOverridden->getClassInterface()) { + if (isa<ObjCProtocolDecl>(SuperOverridden->getDeclContext()) || + CurrentClass != SuperOverridden->getClassInterface()) { hasOverriddenMethodsInBaseOrProtocol = true; overridden->setOverriding(true); break; diff --git a/test/SemaObjC/protocol-lookup-2.m b/test/SemaObjC/protocol-lookup-2.m index 9e8ed8a627b..90f6db0c84f 100644 --- a/test/SemaObjC/protocol-lookup-2.m +++ b/test/SemaObjC/protocol-lookup-2.m @@ -32,3 +32,26 @@ } @end + + +@protocol ProtC +-document; +@end + +@interface I1 : NSObject +@end + +@interface I1(cat) +-document; +@end + +@interface I2 : NSObject +-document; +@end + +@interface I2() <ProtC> +@end + +@implementation I2 +- document { return 0; } +@end -- GitLab