forked from OSchip/llvm-project
Fix <rdar://problem/6497242> Inherited overridden protocol declared objects don't work.
Change Sema::DiagnosePropertyMismatch() to check for type compatibility (rather than type equivalence, which is too strict). llvm-svn: 65949
This commit is contained in:
parent
157599fe1c
commit
3e1181e2e9
|
@ -144,8 +144,8 @@ DIAG(warn_readonly_property, WARNING,
|
|||
"'readwrite' of property inherited from %1")
|
||||
DIAG(warn_property_attribute, WARNING,
|
||||
"property %0 '%1' attribute does not match the property inherited from %2")
|
||||
DIAG(warn_property_type, WARNING,
|
||||
"property type %0 does not match property type inherited from %1")
|
||||
DIAG(warn_property_types_are_incompatible, WARNING,
|
||||
"property type %0 is incompatible with type %1 inherited from %2")
|
||||
DIAG(err_undef_interface, ERROR,
|
||||
"cannot find interface declaration for %0")
|
||||
DIAG(warn_dup_category_def, WARNING,
|
||||
|
|
|
@ -320,12 +320,20 @@ Sema::DiagnosePropertyMismatch(ObjCPropertyDecl *Property,
|
|||
if (Property->getGetterName() != SuperProperty->getGetterName())
|
||||
Diag(Property->getLocation(), diag::warn_property_attribute)
|
||||
<< Property->getDeclName() << "getter" << inheritedName;
|
||||
|
||||
if (Context.getCanonicalType(Property->getType()) !=
|
||||
Context.getCanonicalType(SuperProperty->getType()))
|
||||
Diag(Property->getLocation(), diag::warn_property_type)
|
||||
<< Property->getType() << inheritedName;
|
||||
|
||||
|
||||
QualType LHSType =
|
||||
Context.getCanonicalType(SuperProperty->getType());
|
||||
QualType RHSType =
|
||||
Context.getCanonicalType(Property->getType());
|
||||
|
||||
if (!Context.typesAreCompatible(LHSType, RHSType)) {
|
||||
// FIXME: Incorporate this test with typesAreCompatible.
|
||||
if (LHSType->isObjCQualifiedIdType() && RHSType->isObjCQualifiedIdType())
|
||||
if (ObjCQualifiedIdTypesAreCompatible(LHSType, RHSType, false))
|
||||
return;
|
||||
Diag(Property->getLocation(), diag::warn_property_types_are_incompatible)
|
||||
<< Property->getType() << SuperProperty->getType() << inheritedName;
|
||||
}
|
||||
}
|
||||
|
||||
/// ComparePropertiesInBaseAndSuper - This routine compares property
|
||||
|
|
|
@ -540,6 +540,7 @@ static bool ClassImplementsProtocol(ObjCProtocolDecl *lProto,
|
|||
|
||||
/// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an
|
||||
/// ObjCQualifiedIDType.
|
||||
/// FIXME: Move to ASTContext::typesAreCompatible() and friends.
|
||||
bool Sema::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs,
|
||||
bool compare) {
|
||||
// Allow id<P..> and an 'id' or void* type in all cases.
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
// RUN: clang %s -fsyntax-only -verify
|
||||
|
||||
// <rdar://problem/6497242> Inherited overridden protocol declared objects don't work
|
||||
|
||||
@protocol NSObject @end
|
||||
@interface NSObject @end
|
||||
|
||||
@protocol FooDelegate<NSObject>
|
||||
@optional
|
||||
- (void)fooTask;
|
||||
@end
|
||||
|
||||
@protocol BarDelegate<NSObject, FooDelegate>
|
||||
@optional
|
||||
- (void)barTask;
|
||||
@end
|
||||
|
||||
@interface Foo : NSObject {
|
||||
id _delegate;
|
||||
}
|
||||
@property(nonatomic, assign) id<FooDelegate> delegate;
|
||||
@property(nonatomic, assign) id<BarDelegate> delegate2;
|
||||
@end
|
||||
@interface Bar : Foo {
|
||||
}
|
||||
@property(nonatomic, assign) id<BarDelegate> delegate;
|
||||
@property(nonatomic, assign) id<FooDelegate> delegate2; // expected-warning{{property type 'id<FooDelegate>' is incompatible with type 'id<BarDelegate>' inherited from 'Foo'}}
|
||||
@end
|
||||
|
||||
@interface NSData @end
|
||||
|
||||
@interface NSMutableData : NSData @end
|
||||
|
||||
@interface Base : NSData
|
||||
@property(assign) id ref;
|
||||
@property(assign) Base *p_base;
|
||||
@property(assign) NSMutableData *p_data;
|
||||
@end
|
||||
|
||||
@interface Data : Base
|
||||
@property(assign) NSData *ref;
|
||||
@property(assign) Data *p_base;
|
||||
@property(assign) NSData *p_data; // expected-warning{{property type 'NSData *' is incompatible with type 'NSMutableData *' inherited from 'Base'}}
|
||||
@end
|
Loading…
Reference in New Issue