forked from OSchip/llvm-project
[arcmt] When checking whether properties needs to be strong or not, take into account
that assigning result of -retain means it should be strong. rdar://9931757. llvm-svn: 137252
This commit is contained in:
parent
37a62058fe
commit
93db2277e6
|
@ -330,6 +330,11 @@ private:
|
|||
if (RE->getDecl() != Ivar)
|
||||
return true;
|
||||
|
||||
if (ObjCMessageExpr *
|
||||
ME = dyn_cast<ObjCMessageExpr>(E->getRHS()->IgnoreParenCasts()))
|
||||
if (ME->getMethodFamily() == OMF_retain)
|
||||
return false;
|
||||
|
||||
ImplicitCastExpr *implCE = dyn_cast<ImplicitCastExpr>(E->getRHS());
|
||||
while (implCE && implCE->getCastKind() == CK_BitCast)
|
||||
implCE = dyn_cast<ImplicitCastExpr>(implCE->getSubExpr());
|
||||
|
|
|
@ -32,20 +32,20 @@ typedef _NSCachedAttributedString *BadClassForWeak;
|
|||
@property Forw *not_safe3;
|
||||
@property (readonly) Foo *assign_plus1;
|
||||
@property (readonly) Foo *assign_plus2;
|
||||
@property (readonly) Foo *assign_plus3;
|
||||
|
||||
@property (assign) Foo *no_user_ivar1;
|
||||
@property (readonly) Foo *no_user_ivar2;
|
||||
|
||||
-(void)test;
|
||||
@end
|
||||
|
||||
@implementation Foo
|
||||
@synthesize x,w,q1,q2,oo,bcw,not_safe1,not_safe2,not_safe3;
|
||||
@synthesize no_user_ivar1, no_user_ivar2;
|
||||
@synthesize assign_plus1, assign_plus2;
|
||||
@synthesize assign_plus1, assign_plus2, assign_plus3;
|
||||
|
||||
-(void)test {
|
||||
-(void)test:(Foo *)parm {
|
||||
assign_plus1 = [[Foo alloc] init];
|
||||
assign_plus2 = [Foo new];
|
||||
assign_plus3 = [parm retain];
|
||||
}
|
||||
@end
|
||||
|
|
|
@ -32,20 +32,20 @@ typedef _NSCachedAttributedString *BadClassForWeak;
|
|||
@property (unsafe_unretained) Forw *not_safe3;
|
||||
@property (readonly) Foo *assign_plus1;
|
||||
@property (strong, readonly) Foo *assign_plus2;
|
||||
@property (strong, readonly) Foo *assign_plus3;
|
||||
|
||||
@property (weak) Foo *no_user_ivar1;
|
||||
@property (weak, readonly) Foo *no_user_ivar2;
|
||||
|
||||
-(void)test;
|
||||
@end
|
||||
|
||||
@implementation Foo
|
||||
@synthesize x,w,q1,q2,oo,bcw,not_safe1,not_safe2,not_safe3;
|
||||
@synthesize no_user_ivar1, no_user_ivar2;
|
||||
@synthesize assign_plus1, assign_plus2;
|
||||
@synthesize assign_plus1, assign_plus2, assign_plus3;
|
||||
|
||||
-(void)test {
|
||||
-(void)test:(Foo *)parm {
|
||||
assign_plus1 = [[Foo alloc] init];
|
||||
assign_plus2 = [Foo new];
|
||||
assign_plus3 = parm;
|
||||
}
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue