mirror of https://github.com/microsoft/clang.git
objective-C: Fixes a bogus warning due to not setting
the "nonatomic" attribute in property redeclaration in class extension. Also, improved on diagnostics in this area while at it. // rdar://13156292 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174821 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7728057cf0
commit
b7b2565935
|
@ -482,7 +482,7 @@ def warn_readonly_property : Warning<
|
|||
"'readwrite' of property inherited from %1">;
|
||||
|
||||
def warn_property_attribute : Warning<
|
||||
"property %0 '%1' attribute does not match the property inherited from %2">;
|
||||
"'%1' attribute on property %0 does not match the property inherited from %2">;
|
||||
def warn_property_types_are_incompatible : Warning<
|
||||
"property type %0 is incompatible with type %1 inherited from %2">;
|
||||
def err_undef_interface : Error<"cannot find interface declaration for %0">;
|
||||
|
|
|
@ -368,6 +368,10 @@ Sema::HandlePropertyInClassExtension(Scope *S,
|
|||
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly);
|
||||
if (Attributes & ObjCDeclSpec::DQ_PR_readwrite)
|
||||
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readwrite);
|
||||
if (Attributes & ObjCDeclSpec::DQ_PR_nonatomic)
|
||||
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nonatomic);
|
||||
if (Attributes & ObjCDeclSpec::DQ_PR_atomic)
|
||||
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_atomic);
|
||||
// Set setter/getter selector name. Needed later.
|
||||
PDecl->setGetterName(GetterSel);
|
||||
PDecl->setSetterName(SetterSel);
|
||||
|
@ -1292,15 +1296,21 @@ Sema::DiagnosePropertyMismatch(ObjCPropertyDecl *Property,
|
|||
}
|
||||
|
||||
if ((CAttr & ObjCPropertyDecl::OBJC_PR_nonatomic)
|
||||
!= (SAttr & ObjCPropertyDecl::OBJC_PR_nonatomic))
|
||||
!= (SAttr & ObjCPropertyDecl::OBJC_PR_nonatomic)) {
|
||||
Diag(Property->getLocation(), diag::warn_property_attribute)
|
||||
<< Property->getDeclName() << "atomic" << inheritedName;
|
||||
if (Property->getSetterName() != SuperProperty->getSetterName())
|
||||
Diag(SuperProperty->getLocation(), diag::note_property_declare);
|
||||
}
|
||||
if (Property->getSetterName() != SuperProperty->getSetterName()) {
|
||||
Diag(Property->getLocation(), diag::warn_property_attribute)
|
||||
<< Property->getDeclName() << "setter" << inheritedName;
|
||||
if (Property->getGetterName() != SuperProperty->getGetterName())
|
||||
Diag(SuperProperty->getLocation(), diag::note_property_declare);
|
||||
}
|
||||
if (Property->getGetterName() != SuperProperty->getGetterName()) {
|
||||
Diag(Property->getLocation(), diag::warn_property_attribute)
|
||||
<< Property->getDeclName() << "getter" << inheritedName;
|
||||
Diag(SuperProperty->getLocation(), diag::note_property_declare);
|
||||
}
|
||||
|
||||
QualType LHSType =
|
||||
Context.getCanonicalType(SuperProperty->getType());
|
||||
|
|
|
@ -9,6 +9,25 @@
|
|||
@end
|
||||
|
||||
@interface NOW : I
|
||||
@property (readonly) id d1; // expected-warning {{attribute 'readonly' of property 'd1' restricts attribute 'readwrite' of property inherited from 'I'}} expected-warning {{property 'd1' 'copy' attribute does not match the property inherited from 'I'}}
|
||||
@property (readonly) id d1; // expected-warning {{attribute 'readonly' of property 'd1' restricts attribute 'readwrite' of property inherited from 'I'}} expected-warning {{'copy' attribute on property 'd1' does not match the property inherited from 'I'}}
|
||||
@property (readwrite, copy) I* d2;
|
||||
@end
|
||||
|
||||
// rdar://13156292
|
||||
typedef signed char BOOL;
|
||||
|
||||
@protocol EKProtocolCalendar
|
||||
@property (nonatomic, readonly) BOOL allowReminders;
|
||||
@property (atomic, readonly) BOOL allowNonatomicProperty; // expected-note {{property declared here}}
|
||||
@end
|
||||
|
||||
@protocol EKProtocolMutableCalendar <EKProtocolCalendar>
|
||||
@end
|
||||
|
||||
@interface EKCalendar
|
||||
@end
|
||||
|
||||
@interface EKCalendar () <EKProtocolMutableCalendar>
|
||||
@property (nonatomic, assign) BOOL allowReminders;
|
||||
@property (nonatomic, assign) BOOL allowNonatomicProperty; // expected-warning {{'atomic' attribute on property 'allowNonatomicProperty' does not match the property inherited from 'EKProtocolCalendar'}}
|
||||
@end
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
int newO;
|
||||
int oldO;
|
||||
}
|
||||
@property (retain) id MayCauseError; // expected-warning {{property 'MayCauseError' 'copy' attribute does not match the property inherited from 'ProtocolObject'}}
|
||||
@property (retain) id MayCauseError; // expected-warning {{'copy' attribute on property 'MayCauseError' does not match the property inherited from 'ProtocolObject'}}
|
||||
@end
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
@end
|
||||
|
||||
@interface I (Cat2) <P1>
|
||||
@property (retain) id ID; // expected-warning {{property 'ID' 'copy' attribute does not match the property inherited from 'P1'}}
|
||||
@property (retain) id ID; // expected-warning {{'copy' attribute on property 'ID' does not match the property inherited from 'P1'}}
|
||||
@end
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue