[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
This commit is contained in:
Pierre Habouzit 2019-12-17 11:06:17 -08:00 committed by Alex Lorenz
parent 0412f518dc
commit a4e1819c16
2 changed files with 17 additions and 1 deletions

View File

@ -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(),

View File

@ -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;