[clang] a4e1819 - [objc_direct] fix uniquing when re-declaring a readwrite-direct property

Alex Lorenz via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 17 11:08:15 PST 2019


Author: Pierre Habouzit
Date: 2019-12-17T11:07:48-08:00
New Revision: a4e1819c16836dba928e646024a2406bb2eb3f94

URL: https://github.com/llvm/llvm-project/commit/a4e1819c16836dba928e646024a2406bb2eb3f94
DIFF: https://github.com/llvm/llvm-project/commit/a4e1819c16836dba928e646024a2406bb2eb3f94.diff

LOG: [objc_direct] fix uniquing when re-declaring a readwrite-direct property

ObjCMethodDecl::getCanonicalDecl() for re-declared readwrite properties,
only looks in the ObjCInterface for the declaration of the setter
method, which it won't find.

When the method is a property accessor, we must look in extensions for a
possible redeclaration.

Radar-Id: rdar://problem/57991337

Differential Revision: https://reviews.llvm.org/D71588

Added: 
    

Modified: 
    clang/lib/AST/DeclObjC.cpp
    clang/test/CodeGenObjC/direct-method.m

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp
index fed76aecdaa2..ca70afd9db25 100644
--- a/clang/lib/AST/DeclObjC.cpp
+++ b/clang/lib/AST/DeclObjC.cpp
@@ -958,10 +958,18 @@ ObjCMethodDecl *ObjCMethodDecl::getCanonicalDecl() {
   auto *CtxD = cast<Decl>(getDeclContext());
 
   if (auto *ImplD = dyn_cast<ObjCImplementationDecl>(CtxD)) {
-    if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
+    if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface()) {
       if (ObjCMethodDecl *MD = IFD->getMethod(getSelector(),
                                               isInstanceMethod()))
         return MD;
+      // readwrite properties may have been re-declared in an extension.
+      // look harder.
+      if (isPropertyAccessor())
+        for (auto *Ext : IFD->known_extensions())
+          if (ObjCMethodDecl *MD =
+                  Ext->getMethod(getSelector(), isInstanceMethod()))
+            return MD;
+    }
   } else if (auto *CImplD = dyn_cast<ObjCCategoryImplDecl>(CtxD)) {
     if (ObjCCategoryDecl *CatD = CImplD->getCategoryDecl())
       if (ObjCMethodDecl *MD = CatD->getMethod(getSelector(),

diff  --git a/clang/test/CodeGenObjC/direct-method.m b/clang/test/CodeGenObjC/direct-method.m
index 373bd22a84cd..c42910c1676a 100644
--- a/clang/test/CodeGenObjC/direct-method.m
+++ b/clang/test/CodeGenObjC/direct-method.m
@@ -191,6 +191,14 @@ int useRoot(Root *r) {
   return [r getInt] + [r intProperty] + [r intProperty2];
 }
 
+int useFoo(Foo *f) {
+  // CHECK-LABEL: define i32 @useFoo
+  // CHECK: call void bitcast {{.*}} @"\01-[Foo setGetDynamic_setDirect:]"
+  // CHECK: %{{[^ ]*}} = call i32 bitcast {{.*}} @"\01-[Foo getDirect_setDynamic]"
+  [f setGetDynamic_setDirect:1];
+  return [f getDirect_setDynamic];
+}
+
 __attribute__((objc_root_class))
 @interface RootDeclOnly
 @property(direct, readonly) int intProperty;


        


More information about the cfe-commits mailing list