mirror of https://github.com/microsoft/clang.git
Add -Wobjc-property-assign-on-object-type.
This is a warning about using 'assign' instead of 'unsafe_unretained' in Objective-C property declarations. It's off by default because there isn't consensus in the Objective-C steering group that this is the right thing to do, but we're nonetheless okay with adding it because there's a substantial pool of Objective-C programmers who will appreciate the warning. Patch by Alfred Zien! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@341489 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f742fbf832
commit
11fd5cf9fd
|
@ -380,6 +380,7 @@ def FunctionDefInObjCContainer : DiagGroup<"function-def-in-objc-container">;
|
|||
def BadFunctionCast : DiagGroup<"bad-function-cast">;
|
||||
def ObjCPropertyImpl : DiagGroup<"objc-property-implementation">;
|
||||
def ObjCPropertyNoAttribute : DiagGroup<"objc-property-no-attribute">;
|
||||
def ObjCPropertyAssignOnObjectType : DiagGroup<"objc-property-assign-on-object-type">;
|
||||
def ObjCProtocolQualifiers : DiagGroup<"objc-protocol-qualifiers">;
|
||||
def ObjCMissingSuperCalls : DiagGroup<"objc-missing-super-calls">;
|
||||
def ObjCDesignatedInit : DiagGroup<"objc-designated-initializers">;
|
||||
|
|
|
@ -1046,6 +1046,9 @@ def err_objc_property_attr_mutually_exclusive : Error<
|
|||
"property attributes '%0' and '%1' are mutually exclusive">;
|
||||
def err_objc_property_requires_object : Error<
|
||||
"property with '%0' attribute must be of object type">;
|
||||
def warn_objc_property_assign_on_object : Warning<
|
||||
"'assign' property of object type may become a dangling reference; consider using 'unsafe_unretained'">,
|
||||
InGroup<ObjCPropertyAssignOnObjectType>, DefaultIgnore;
|
||||
def warn_objc_property_no_assignment_attribute : Warning<
|
||||
"no 'assign', 'retain', or 'copy' attribute is specified - "
|
||||
"'assign' is assumed">,
|
||||
|
|
|
@ -2557,6 +2557,14 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl,
|
|||
PropertyDecl->setInvalidDecl();
|
||||
}
|
||||
|
||||
// Check for assign on object types.
|
||||
if ((Attributes & ObjCDeclSpec::DQ_PR_assign) &&
|
||||
!(Attributes & ObjCDeclSpec::DQ_PR_unsafe_unretained) &&
|
||||
PropertyTy->isObjCRetainableType() &&
|
||||
!PropertyTy->isObjCARCImplicitlyUnretainedType()) {
|
||||
Diag(Loc, diag::warn_objc_property_assign_on_object);
|
||||
}
|
||||
|
||||
// Check for more than one of { assign, copy, retain }.
|
||||
if (Attributes & ObjCDeclSpec::DQ_PR_assign) {
|
||||
if (Attributes & ObjCDeclSpec::DQ_PR_copy) {
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify -Wobjc-property-assign-on-object-type %s
|
||||
|
||||
@interface Foo @end
|
||||
@protocol Prot @end
|
||||
|
||||
@interface Bar
|
||||
@property(assign, readonly) Foo* o1; // expected-warning {{'assign' property of object type may become a dangling reference; consider using 'unsafe_unretained'}}
|
||||
@property(unsafe_unretained, readonly) Foo* o2;
|
||||
|
||||
@property(assign) Class classProperty;
|
||||
@property(assign) Class<Prot> classWithProtocolProperty;
|
||||
@property(assign) int s1;
|
||||
@property(assign) int* s2;
|
||||
@end
|
||||
|
||||
@interface Bar ()
|
||||
@property(readwrite) Foo* o1;
|
||||
@property(readwrite) Foo* o2;
|
||||
@end
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fobjc-weak -verify -Weverything %s
|
||||
// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fobjc-weak -fsyntax-only -verify -Weverything %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fobjc-weak -verify -Wproperty-attribute-mismatch %s
|
||||
// RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak -fobjc-weak -fsyntax-only -verify -Wproperty-attribute-mismatch %s
|
||||
// rdar://12103400
|
||||
|
||||
@class NSString;
|
||||
|
|
Loading…
Reference in New Issue