From f5fc20ff49b9adae90bfb30c60c7ade7d8be98e4 Mon Sep 17 00:00:00 2001
From: Ted Kremenek <kremenek@apple.com>
Date: Sat, 23 Nov 2013 22:29:06 +0000
Subject: [PATCH] Move logic to check if a class is tagged with
 objc_suppress_protocol_methods into a helper.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@195559 91177308-0d34-0410-b5e6-96231b3b80d8
---
 include/clang/AST/DeclObjC.h |  4 ++++
 lib/AST/DeclObjC.cpp         | 30 ++++++++++++++++++------------
 2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index 23778cb368a..def5817793f 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -925,6 +925,10 @@ public:
                                               : superCls; 
   }
 
+  /// \brief Returns true if this class is marked to suppress being
+  /// used to determine if a subclass conforms to a protocol.
+  bool shouldSuppressProtocol(const ObjCProtocolDecl *P) const;
+
   /// \brief Iterator that walks over the list of categories, filtering out
   /// those that do not meet specific criteria.
   ///
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index a4857b60731..69de6a3c859 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -256,6 +256,22 @@ ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
 
 void ObjCInterfaceDecl::anchor() { }
 
+bool ObjCInterfaceDecl::shouldSuppressProtocol(const ObjCProtocolDecl *P) const{
+  if (!hasAttrs())
+    return false;
+  const AttrVec &V = getAttrs();
+  const IdentifierInfo *PI = P->getIdentifier();
+  for (AttrVec::const_iterator I = V.begin(), E = V.end(); I != E; ++I) {
+    if (const ObjCSuppressProtocolAttr *A =
+        dyn_cast<ObjCSuppressProtocolAttr>(*I)){
+      if (A->getProtocol() == PI) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
 /// FindPropertyVisibleInPrimaryClass - Finds declaration of the property
 /// with name 'PropertyId' in the primary class; including those in protocols
 /// (direct or indirect) used by the primary class.
@@ -477,18 +493,8 @@ ObjCMethodDecl *ObjCInterfaceDecl::lookupMethod(Selector Sel,
     // If we are looking for a method that is part of protocol conformance,
     // check if the superclass has been marked to suppress conformance
     // of that protocol.
-    if (P && ClassDecl->hasAttrs()) {
-      const AttrVec &V = ClassDecl->getAttrs();
-      const IdentifierInfo *PI = P->getIdentifier();
-      for (AttrVec::const_iterator I = V.begin(), E = V.end(); I != E; ++I) {
-        if (const ObjCSuppressProtocolAttr *A =
-            dyn_cast<ObjCSuppressProtocolAttr>(*I)){
-          if (A->getProtocol() == PI) {
-            return 0;
-          }
-        }
-      }
-    }
+    if (P && ClassDecl->shouldSuppressProtocol(P))
+      return 0;
 
     if ((MethodDecl = ClassDecl->getMethod(Sel, isInstance)))
       return MethodDecl;
-- 
GitLab