On Mar 29, 2013, at 2:54 PM, Jordan Rose <[email protected]> wrote:
> Test case? In r178378. > > On Mar 29, 2013, at 14:51 , Argyrios Kyrtzidis <[email protected]> wrote: > >> Author: akirtzidis >> Date: Fri Mar 29 16:51:48 2013 >> New Revision: 178374 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=178374&view=rev >> Log: >> When looking for overridden ObjC methods, don't ignore 'hidden' ones. >> >> When using modules we should not ignore overridden methods from >> categories that are hidden because the module is not visible. >> This will give more consistent results (when imports change) and it's more >> correct since the methods are indeed overridden even if they are not >> "visible" >> for lookup purposes. >> >> rdar://13350796 >> >> Modified: >> cfe/trunk/include/clang/AST/DeclObjC.h >> cfe/trunk/lib/AST/DeclObjC.cpp >> cfe/trunk/lib/Sema/SemaDeclObjC.cpp >> >> Modified: cfe/trunk/include/clang/AST/DeclObjC.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=178374&r1=178373&r2=178374&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/AST/DeclObjC.h (original) >> +++ cfe/trunk/include/clang/AST/DeclObjC.h Fri Mar 29 16:51:48 2013 >> @@ -537,12 +537,14 @@ public: >> } >> >> // Get the local instance/class method declared in this interface. >> - ObjCMethodDecl *getMethod(Selector Sel, bool isInstance) const; >> - ObjCMethodDecl *getInstanceMethod(Selector Sel) const { >> - return getMethod(Sel, true/*isInstance*/); >> + ObjCMethodDecl *getMethod(Selector Sel, bool isInstance, >> + bool AllowHidden = false) const; >> + ObjCMethodDecl *getInstanceMethod(Selector Sel, >> + bool AllowHidden = false) const { >> + return getMethod(Sel, true/*isInstance*/, AllowHidden); >> } >> - ObjCMethodDecl *getClassMethod(Selector Sel) const { >> - return getMethod(Sel, false/*isInstance*/); >> + ObjCMethodDecl *getClassMethod(Selector Sel, bool AllowHidden = false) >> const { >> + return getMethod(Sel, false/*isInstance*/, AllowHidden); >> } >> bool HasUserDeclaredSetterMethod(const ObjCPropertyDecl *P) const; >> ObjCIvarDecl *getIvarDecl(IdentifierInfo *Id) const; >> >> Modified: cfe/trunk/lib/AST/DeclObjC.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=178374&r1=178373&r2=178374&view=diff >> ============================================================================== >> --- cfe/trunk/lib/AST/DeclObjC.cpp (original) >> +++ cfe/trunk/lib/AST/DeclObjC.cpp Fri Mar 29 16:51:48 2013 >> @@ -65,12 +65,13 @@ ObjCContainerDecl::getIvarDecl(Identifie >> >> // Get the local instance/class method declared in this interface. >> ObjCMethodDecl * >> -ObjCContainerDecl::getMethod(Selector Sel, bool isInstance) const { >> +ObjCContainerDecl::getMethod(Selector Sel, bool isInstance, >> + bool AllowHidden) const { >> // If this context is a hidden protocol definition, don't find any >> // methods there. >> if (const ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(this)) { >> if (const ObjCProtocolDecl *Def = Proto->getDefinition()) >> - if (Def->isHidden()) >> + if (Def->isHidden() && !AllowHidden) >> return 0; >> } >> >> @@ -854,7 +855,8 @@ static void CollectOverriddenMethodsRecu >> if (MovedToSuper) >> if (ObjCMethodDecl * >> Overridden = Container->getMethod(Method->getSelector(), >> - Method->isInstanceMethod())) >> + Method->isInstanceMethod(), >> + /*AllowHidden=*/true)) >> if (Method != Overridden) { >> // We found an override at this category; there is no need to look >> // into its protocols. >> @@ -872,7 +874,8 @@ static void CollectOverriddenMethodsRecu >> // Check whether we have a matching method at this level. >> if (const ObjCMethodDecl * >> Overridden = Container->getMethod(Method->getSelector(), >> - >> Method->isInstanceMethod())) >> + Method->isInstanceMethod(), >> + /*AllowHidden=*/true)) >> if (Method != Overridden) { >> // We found an override at this level; there is no need to look >> // into other protocols or categories. >> @@ -894,9 +897,9 @@ static void CollectOverriddenMethodsRecu >> P != PEnd; ++P) >> CollectOverriddenMethodsRecurse(*P, Method, Methods, MovedToSuper); >> >> - for (ObjCInterfaceDecl::visible_categories_iterator >> - Cat = Interface->visible_categories_begin(), >> - CatEnd = Interface->visible_categories_end(); >> + for (ObjCInterfaceDecl::known_categories_iterator >> + Cat = Interface->known_categories_begin(), >> + CatEnd = Interface->known_categories_end(); >> Cat != CatEnd; ++Cat) { >> CollectOverriddenMethodsRecurse(*Cat, Method, Methods, >> MovedToSuper); >> @@ -931,7 +934,8 @@ static void collectOverriddenMethodsSlow >> // Start searching for overridden methods using the method from the >> // interface as starting point. >> if (const ObjCMethodDecl *IFaceMeth = >> ID->getMethod(Method->getSelector(), >> - >> Method->isInstanceMethod())) >> + >> Method->isInstanceMethod(), >> + /*AllowHidden=*/true)) >> Method = IFaceMeth; >> CollectOverriddenMethods(ID, Method, overridden); >> >> @@ -943,7 +947,8 @@ static void collectOverriddenMethodsSlow >> // Start searching for overridden methods using the method from the >> // interface as starting point. >> if (const ObjCMethodDecl *IFaceMeth = >> ID->getMethod(Method->getSelector(), >> - >> Method->isInstanceMethod())) >> + >> Method->isInstanceMethod(), >> + /*AllowHidden=*/true)) >> Method = IFaceMeth; >> CollectOverriddenMethods(ID, Method, overridden); >> >> @@ -962,9 +967,9 @@ static void collectOnCategoriesAfterLoca >> if (!Class) >> return; >> >> - for (ObjCInterfaceDecl::visible_categories_iterator >> - Cat = Class->visible_categories_begin(), >> - CatEnd = Class->visible_categories_end(); >> + for (ObjCInterfaceDecl::known_categories_iterator >> + Cat = Class->known_categories_begin(), >> + CatEnd = Class->known_categories_end(); >> Cat != CatEnd; ++Cat) { >> if (SM.isBeforeInTranslationUnit(Loc, Cat->getLocation())) >> CollectOverriddenMethodsRecurse(*Cat, Method, Methods, true); >> >> Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=178374&r1=178373&r2=178374&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Fri Mar 29 16:51:48 2013 >> @@ -2727,9 +2727,9 @@ private: >> return; >> >> // - categories, >> - for (ObjCInterfaceDecl::visible_categories_iterator >> - cat = iface->visible_categories_begin(), >> - catEnd = iface->visible_categories_end(); >> + for (ObjCInterfaceDecl::known_categories_iterator >> + cat = iface->known_categories_begin(), >> + catEnd = iface->known_categories_end(); >> cat != catEnd; ++cat) { >> search(*cat); >> } >> @@ -2759,7 +2759,8 @@ private: >> void search(ObjCContainerDecl *container) { >> // Check for a method in this container which matches this selector. >> ObjCMethodDecl *meth = container->getMethod(Method->getSelector(), >> - Method->isInstanceMethod()); >> + Method->isInstanceMethod(), >> + /*AllowHidden=*/true); >> >> // If we find one, record it and bail out. >> if (meth) { >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
