From: Ted Kremenek Date: Wed, 5 Mar 2014 23:18:22 +0000 (+0000) Subject: Fix recursion bug in logic to validate 'objc_protocol_requires_explicit_implementatio... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d038ebe8f182ed6a54cff3c63747c2cda59dd9f3;p=clang Fix recursion bug in logic to validate 'objc_protocol_requires_explicit_implementation' conformance. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203024 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 57f40aaca5..f71bd56a42 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1635,6 +1635,17 @@ void Sema::WarnExactTypedMethods(ObjCMethodDecl *ImpMethodDecl, typedef llvm::DenseSet ProtocolNameSet; typedef llvm::OwningPtr LazyProtocolNameSet; + + +static void findProtocolsWithExplicitImpls(const ObjCProtocolDecl *PDecl, + ProtocolNameSet &PNS) { + if (PDecl->hasAttr()) + 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()) - PNS.insert(PDecl->getIdentifier()); + findProtocolsWithExplicitImpls(*I, PNS); } + + findProtocolsWithExplicitImpls(Super->getSuperClass(), PNS); } /// CheckProtocolMethodDefs - This routine checks unimplemented methods diff --git a/test/SemaObjC/protocols-suppress-conformance.m b/test/SemaObjC/protocols-suppress-conformance.m index 3bb892780c..299e44e807 100644 --- a/test/SemaObjC/protocols-suppress-conformance.m +++ b/test/SemaObjC/protocols-suppress-conformance.m @@ -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 @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