]> granicus.if.org Git - clang/commitdiff
Fix recursion bug in logic to validate 'objc_protocol_requires_explicit_implementatio...
authorTed Kremenek <kremenek@apple.com>
Wed, 5 Mar 2014 23:18:22 +0000 (23:18 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 5 Mar 2014 23:18:22 +0000 (23:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203024 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclObjC.cpp
test/SemaObjC/protocols-suppress-conformance.m

index 57f40aaca5493dd7040008c964a4ea59d63c7d99..f71bd56a42b062afb06aa1ff06c4c53bf5544005 100644 (file)
@@ -1635,6 +1635,17 @@ void Sema::WarnExactTypedMethods(ObjCMethodDecl *ImpMethodDecl,
 typedef llvm::DenseSet<IdentifierInfo*> ProtocolNameSet;
 typedef llvm::OwningPtr<ProtocolNameSet> LazyProtocolNameSet;
 
+
+
+static void findProtocolsWithExplicitImpls(const ObjCProtocolDecl *PDecl,
+                                           ProtocolNameSet &PNS) {
+  if (PDecl->hasAttr<ObjCExplicitProtocolImplAttr>())
+    PNS.insert(PDecl->getIdentifier());
+  for (ObjCProtocolDecl::protocol_iterator PI = PDecl->protocol_begin(),
+       PE = PDecl->protocol_end(); PI != PE; ++PI)
+    findProtocolsWithExplicitImpls(*PI, PNS);
+}
+
 /// Recursively populates a set with all conformed protocols in a class
 /// hierarchy that have the 'objc_protocol_requires_explicit_implementation'
 /// attribute.
@@ -1646,10 +1657,10 @@ static void findProtocolsWithExplicitImpls(const ObjCInterfaceDecl *Super,
   for (ObjCInterfaceDecl::all_protocol_iterator
         I = Super->all_referenced_protocol_begin(),
         E = Super->all_referenced_protocol_end(); I != E; ++I) {
-    const ObjCProtocolDecl *PDecl = *I;
-    if (PDecl->hasAttr<ObjCExplicitProtocolImplAttr>())
-      PNS.insert(PDecl->getIdentifier());
+    findProtocolsWithExplicitImpls(*I, PNS);
   }
+
+  findProtocolsWithExplicitImpls(Super->getSuperClass(), PNS);
 }
 
 /// CheckProtocolMethodDefs - This routine checks unimplemented methods
index 3bb892780c15ef8637c5da711b1465e154461553..299e44e8074e5c72b690e4fdd61824a7017dbe8f 100644 (file)
@@ -178,7 +178,7 @@ __attribute__((objc_protocol_requires_explicit_implementation))  // expected-err
 
  __attribute__((objc_protocol_requires_explicit_implementation))
 @protocol Ex2ProtocolA
-- (void)methodB; // expected-note {{method 'methodB' declared here}}
+- (void)methodB;
 @end
 
  __attribute__((objc_protocol_requires_explicit_implementation))
@@ -202,7 +202,6 @@ __attribute__((objc_protocol_requires_explicit_implementation))  // expected-err
 @interface Ex2ClassB : Ex2ClassA <Ex2ProtocolB>
 @end
 
-@implementation Ex2ClassB // expected-warning {{method 'methodB' in protocol 'Ex2ProtocolA' not implemented}}\
-                          // expected-warning {{method 'methodA' in protocol 'Ex2ProtocolB' not implemented}}
+@implementation Ex2ClassB // expected-warning {{method 'methodA' in protocol 'Ex2ProtocolB' not implemented}}
 @end