r178374 - When looking for overridden ObjC methods, don't ignore 'hidden' ones.

Argyrios Kyrtzidis akyrtzi at gmail.com
Fri Mar 29 15:18:07 PDT 2013


On Mar 29, 2013, at 2:54 PM, Jordan Rose <jordan_rose at apple.com> wrote:

> Test case?

In r178378.


> 
> On Mar 29, 2013, at 14:51 , Argyrios Kyrtzidis <akyrtzi at gmail.com> 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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130329/1d8125ab/attachment.html>


More information about the cfe-commits mailing list