r203024 - Fix recursion bug in logic to validate 'objc_protocol_requires_explicit_implementation' conformance.

Ted Kremenek kremenek at apple.com
Wed Mar 5 15:18:22 PST 2014


Author: kremenek
Date: Wed Mar  5 17:18:22 2014
New Revision: 203024

URL: http://llvm.org/viewvc/llvm-project?rev=203024&view=rev
Log:
Fix recursion bug in logic to validate 'objc_protocol_requires_explicit_implementation' conformance.

Modified:
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp
    cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=203024&r1=203023&r2=203024&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Wed Mar  5 17:18:22 2014
@@ -1635,6 +1635,17 @@ void Sema::WarnExactTypedMethods(ObjCMet
 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 findProtocolsWithExplicitImp
   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

Modified: cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m?rev=203024&r1=203023&r2=203024&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m (original)
+++ cfe/trunk/test/SemaObjC/protocols-suppress-conformance.m Wed Mar  5 17:18:22 2014
@@ -178,7 +178,7 @@ __attribute__((objc_protocol_requires_ex
 
  __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_ex
 @interface Ex2ClassB : Ex2ClassA <Ex2ProtocolB>
 @end
 
- at implementation Ex2ClassB // expected-warning {{method 'methodB' in protocol 'Ex2ProtocolA' not implemented}}\
-                          // expected-warning {{method 'methodA' in protocol 'Ex2ProtocolB' not implemented}}
+ at implementation Ex2ClassB // expected-warning {{method 'methodA' in protocol 'Ex2ProtocolB' not implemented}}
 @end
 





More information about the cfe-commits mailing list