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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits