forked from OSchip/llvm-project
[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:
parent
0412f518dc
commit
a4e1819c16
|
@ -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(),
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue