diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-10-17 23:14:16 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-10-17 23:14:16 +0000 |
commit | 01b2b9bb154d69cc695717876e903329f6f0973c (patch) | |
tree | 1d9943d2ee3acdda4dc828de36a8989966931ded | |
parent | 841804baff6ea8ba1904a2ba81265aae1479e882 (diff) |
[arcmt] In ARC default for properties is 'strong' so just remove a 'retain' if possible,
instead of changing it to 'strong'. rdar://9984862.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142304 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/ARCMigrate/TransProperties.cpp | 40 | ||||
-rw-r--r-- | test/ARCMT/assign-prop-with-arc-runtime.m | 6 | ||||
-rw-r--r-- | test/ARCMT/assign-prop-with-arc-runtime.m.result | 6 | ||||
-rw-r--r-- | test/ARCMT/releases-driver.m.result | 2 | ||||
-rw-r--r-- | test/ARCMT/releases.m.result | 2 | ||||
-rw-r--r-- | test/ARCMT/remove-dealloc-method.m.result | 8 | ||||
-rw-r--r-- | test/ARCMT/remove-dealloc-zerouts.m.result | 10 | ||||
-rw-r--r-- | test/ARCMT/retains.m.result | 2 |
8 files changed, 61 insertions, 15 deletions
diff --git a/lib/ARCMigrate/TransProperties.cpp b/lib/ARCMigrate/TransProperties.cpp index ca845b6b33..2f5fe8be4c 100644 --- a/lib/ARCMigrate/TransProperties.cpp +++ b/lib/ARCMigrate/TransProperties.cpp @@ -132,7 +132,10 @@ private: return; if (propAttrs & ObjCPropertyDecl::OBJC_PR_retain) { - rewriteAttribute("retain", "strong", atLoc); + if (propAttrs & ObjCPropertyDecl::OBJC_PR_readonly) + rewriteAttribute("retain", "strong", atLoc); + else + removeAttribute("retain", atLoc); // strong is the default. return; } @@ -215,6 +218,10 @@ private: } } + bool removeAttribute(StringRef fromAttr, SourceLocation atLoc) const { + return rewriteAttribute(fromAttr, StringRef(), atLoc); + } + bool rewriteAttribute(StringRef fromAttr, StringRef toAttr, SourceLocation atLoc) const { if (atLoc.isMacroID()) @@ -248,6 +255,11 @@ private: lexer.LexFromRawLexer(tok); if (tok.isNot(tok::l_paren)) return false; + Token BeforeTok = tok; + Token AfterTok; + AfterTok.startToken(); + SourceLocation AttrLoc; + lexer.LexFromRawLexer(tok); if (tok.is(tok::r_paren)) return false; @@ -256,18 +268,40 @@ private: if (tok.isNot(tok::raw_identifier)) return false; StringRef ident(tok.getRawIdentifierData(), tok.getLength()); if (ident == fromAttr) { - Pass.TA.replaceText(tok.getLocation(), fromAttr, toAttr); - return true; + if (!toAttr.empty()) { + Pass.TA.replaceText(tok.getLocation(), fromAttr, toAttr); + return true; + } + // We want to remove the attribute. + AttrLoc = tok.getLocation(); } do { lexer.LexFromRawLexer(tok); + if (AttrLoc.isValid() && AfterTok.is(tok::unknown)) + AfterTok = tok; } while (tok.isNot(tok::comma) && tok.isNot(tok::r_paren)); if (tok.is(tok::r_paren)) break; + if (AttrLoc.isInvalid()) + BeforeTok = tok; lexer.LexFromRawLexer(tok); } + if (toAttr.empty() && AttrLoc.isValid() && AfterTok.isNot(tok::unknown)) { + // We want to remove the attribute. + if (BeforeTok.is(tok::l_paren) && AfterTok.is(tok::r_paren)) { + Pass.TA.remove(SourceRange(BeforeTok.getLocation(), + AfterTok.getLocation())); + } else if (BeforeTok.is(tok::l_paren) && AfterTok.is(tok::comma)) { + Pass.TA.remove(SourceRange(AttrLoc, AfterTok.getLocation())); + } else { + Pass.TA.remove(SourceRange(BeforeTok.getLocation(), AttrLoc)); + } + + return true; + } + return false; } diff --git a/test/ARCMT/assign-prop-with-arc-runtime.m b/test/ARCMT/assign-prop-with-arc-runtime.m index 9e10b58f62..4f50aac8eb 100644 --- a/test/ARCMT/assign-prop-with-arc-runtime.m +++ b/test/ARCMT/assign-prop-with-arc-runtime.m @@ -36,12 +36,18 @@ typedef _NSCachedAttributedString *BadClassForWeak; @property (assign) Foo *no_user_ivar1; @property (readonly) Foo *no_user_ivar2; + +@property (retain) id def1; +@property (atomic,retain) id def2; +@property (retain,atomic) id def3; + @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, assign_plus3; +@synthesize def1, def2, def3; -(void)test:(Foo *)parm { assign_plus1 = [[Foo alloc] init]; diff --git a/test/ARCMT/assign-prop-with-arc-runtime.m.result b/test/ARCMT/assign-prop-with-arc-runtime.m.result index 8a3a0f78b6..796af230b4 100644 --- a/test/ARCMT/assign-prop-with-arc-runtime.m.result +++ b/test/ARCMT/assign-prop-with-arc-runtime.m.result @@ -36,12 +36,18 @@ typedef _NSCachedAttributedString *BadClassForWeak; @property (weak) Foo *no_user_ivar1; @property (weak, readonly) Foo *no_user_ivar2; + +@property id def1; +@property (atomic) id def2; +@property (atomic) id def3; + @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, assign_plus3; +@synthesize def1, def2, def3; -(void)test:(Foo *)parm { assign_plus1 = [[Foo alloc] init]; diff --git a/test/ARCMT/releases-driver.m.result b/test/ARCMT/releases-driver.m.result index 70c0aecaf4..14aecce8e9 100644 --- a/test/ARCMT/releases-driver.m.result +++ b/test/ARCMT/releases-driver.m.result @@ -20,7 +20,7 @@ id IhaveSideEffect(); @interface Foo : NSObject { id bar; } -@property (strong) id bar; +@property id bar; -(void)test:(id)obj; @end diff --git a/test/ARCMT/releases.m.result b/test/ARCMT/releases.m.result index 556610ab2a..2b6240b10e 100644 --- a/test/ARCMT/releases.m.result +++ b/test/ARCMT/releases.m.result @@ -20,7 +20,7 @@ id IhaveSideEffect(); @interface Foo : NSObject { id bar; } -@property (strong) id bar; +@property id bar; -(void)test:(id)obj; @end diff --git a/test/ARCMT/remove-dealloc-method.m.result b/test/ARCMT/remove-dealloc-method.m.result index 47e31f9d24..5e1efa8687 100644 --- a/test/ARCMT/remove-dealloc-method.m.result +++ b/test/ARCMT/remove-dealloc-method.m.result @@ -5,10 +5,10 @@ #define nil ((void*) 0) @interface Foo -@property (strong) id x; -@property (strong) id y; -@property (strong) id w; -@property (strong) id z; +@property id x; +@property id y; +@property id w; +@property id z; @end @implementation Foo diff --git a/test/ARCMT/remove-dealloc-zerouts.m.result b/test/ARCMT/remove-dealloc-zerouts.m.result index 9ae831abac..c857760bc3 100644 --- a/test/ARCMT/remove-dealloc-zerouts.m.result +++ b/test/ARCMT/remove-dealloc-zerouts.m.result @@ -3,10 +3,10 @@ // RUN: diff %t %s.result @interface Foo -@property (strong) id x; -@property (strong) id y; -@property (strong) id w; -@property (strong) id z; +@property id x; +@property id y; +@property id w; +@property id z; @property (strong) id q; @end @@ -23,7 +23,7 @@ @end @interface Bar -@property (strong) Foo *a; +@property Foo *a; - (void) setA:(Foo*) val; - (id) a; @end diff --git a/test/ARCMT/retains.m.result b/test/ARCMT/retains.m.result index 2011e50636..19f8972942 100644 --- a/test/ARCMT/retains.m.result +++ b/test/ARCMT/retains.m.result @@ -9,7 +9,7 @@ id IhaveSideEffect(); @interface Foo : NSObject { id bar; } -@property (strong) id bar; +@property id bar; -(id)test:(id)obj; -(id)something; @end |