From 94a9016a6b92cfebdb0b7d4dcad930248f1f301a Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Wed, 10 Aug 2011 21:46:48 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137252 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ARCMigrate/TransProperties.cpp | 5 +++++ test/ARCMT/assign-prop-with-arc-runtime.m | 8 ++++---- test/ARCMT/assign-prop-with-arc-runtime.m.result | 8 ++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/ARCMigrate/TransProperties.cpp b/lib/ARCMigrate/TransProperties.cpp index 943eea2646..1ce02b11ef 100644 --- a/lib/ARCMigrate/TransProperties.cpp +++ b/lib/ARCMigrate/TransProperties.cpp @@ -330,6 +330,11 @@ private: if (RE->getDecl() != Ivar) return true; + if (ObjCMessageExpr * + ME = dyn_cast(E->getRHS()->IgnoreParenCasts())) + if (ME->getMethodFamily() == OMF_retain) + return false; + ImplicitCastExpr *implCE = dyn_cast(E->getRHS()); while (implCE && implCE->getCastKind() == CK_BitCast) implCE = dyn_cast(implCE->getSubExpr()); diff --git a/test/ARCMT/assign-prop-with-arc-runtime.m b/test/ARCMT/assign-prop-with-arc-runtime.m index 1671d6d020..b328bfe158 100644 --- a/test/ARCMT/assign-prop-with-arc-runtime.m +++ b/test/ARCMT/assign-prop-with-arc-runtime.m @@ -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 diff --git a/test/ARCMT/assign-prop-with-arc-runtime.m.result b/test/ARCMT/assign-prop-with-arc-runtime.m.result index d30a2ac00b..3dd903ea5b 100644 --- a/test/ARCMT/assign-prop-with-arc-runtime.m.result +++ b/test/ARCMT/assign-prop-with-arc-runtime.m.result @@ -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 -- 2.40.0