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