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