diff options
-rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 11 | ||||
-rw-r--r-- | clang/test/SemaObjCXX/property-type-mismatch.mm | 10 |
2 files changed, 15 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index f0948b77580..e204936b500 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<ObjCObjectPointerType>(PropertyIvarType) && - isa<ObjCObjectPointerType>(GetterType)) - compat = - Context.canAssignObjCInterfaces( - GetterType->getAs<ObjCObjectPointerType>(), - PropertyIvarType->getAs<ObjCObjectPointerType>()); + const ObjCObjectPointerType *propertyObjCPtr = nullptr; + const ObjCObjectPointerType *getterObjCPtr = nullptr; + if ((propertyObjCPtr = PropertyIvarType->getAs<ObjCObjectPointerType>()) && + (getterObjCPtr = GetterType->getAs<ObjCObjectPointerType>())) + 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 2b267ad96ee..6ab07b8f3b8 100644 --- a/clang/test/SemaObjCXX/property-type-mismatch.mm +++ b/clang/test/SemaObjCXX/property-type-mismatch.mm @@ -18,3 +18,13 @@ @property (assign) NSObject<P2> *prop; @end +@interface C<T> : NSObject +@end + +@interface D +@property (nonatomic,readonly,nonnull) C<D *> *property; +@end + +@interface D () +@property (nonatomic, setter=_setProperty:) C *property; // okay +@end |