Test case? 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
