diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index f0948b775804..e204936b5007 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -1372,12 +1372,11 @@ bool Sema::DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *property, QualType PropertyIvarType = property->getType().getNonReferenceType(); bool compat = Context.hasSameType(PropertyIvarType, GetterType); if (!compat) { - if (isa(PropertyIvarType) && - isa(GetterType)) - compat = - Context.canAssignObjCInterfaces( - GetterType->getAs(), - PropertyIvarType->getAs()); + const ObjCObjectPointerType *propertyObjCPtr = nullptr; + const ObjCObjectPointerType *getterObjCPtr = nullptr; + if ((propertyObjCPtr = PropertyIvarType->getAs()) && + (getterObjCPtr = GetterType->getAs())) + compat = Context.canAssignObjCInterfaces(getterObjCPtr, propertyObjCPtr); else if (CheckAssignmentConstraints(Loc, GetterType, PropertyIvarType) != Compatible) { Diag(Loc, diag::error_property_accessor_type) diff --git a/clang/test/SemaObjCXX/property-type-mismatch.mm b/clang/test/SemaObjCXX/property-type-mismatch.mm index 2b267ad96eef..6ab07b8f3b80 100644 --- a/clang/test/SemaObjCXX/property-type-mismatch.mm +++ b/clang/test/SemaObjCXX/property-type-mismatch.mm @@ -18,3 +18,13 @@ @property (assign) NSObject *prop; @end +@interface C : NSObject +@end + +@interface D +@property (nonatomic,readonly,nonnull) C *property; +@end + +@interface D () +@property (nonatomic, setter=_setProperty:) C *property; // okay +@end