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