]> granicus.if.org Git - clang/commit
[arcmt] More automatic transformations and safety improvements; rdar://9615812 :
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 27 Jul 2011 05:28:18 +0000 (05:28 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 27 Jul 2011 05:28:18 +0000 (05:28 +0000)
commit18fd0c6915b45c4daafe18e3cd324c13306f913f
treefb1e7ed5e727808a7c7e10189aced11902c070a5
parent3ef1ad2d28ef5a9b6ac7ec0bd4b2360a4ae3ee8b
[arcmt] More automatic transformations and safety improvements; rdar://9615812 :

- Replace calling -zone with 'nil'. -zone is obsolete in ARC.
- Allow removing retain/release on a static global var.
- Fix assertion hit when scanning for name references outside a NSAutoreleasePool scope.
- Automatically add bridged casts for results of objc method calls and when calling CFRetain, for example:

NSString *s;
CFStringRef ref = [s string];   -> CFStringRef ref = (__bridge CFStringRef)([s string]);
ref = s.string;                 -> ref = (__bridge CFStringRef)(s.string);
ref = [NSString new];           -> ref = (__bridge_retained CFStringRef)([NSString new]);
ref = [s newString];            -> ref = (__bridge_retained CFStringRef)([s newString]);
ref = [[NSString alloc] init];  -> ref = (__bridge_retained CFStringRef)([[NSString alloc] init]);
ref = [[s string] retain];      -> ref = (__bridge_retained CFStringRef)([s string]);
ref = CFRetain(s);              -> ref = (__bridge_retained CFTypeRef)(s);
ref = [s retain];               -> ref = (__bridge_retained CFStringRef)(s);

- Emit migrator error when trying to cast to CF type the result of autorelease/release:
  for

CFStringRef f3() {
  return (CFStringRef)[[[NSString alloc] init] autorelease];
}

emits:

t.m:12:10: error: [rewriter] it is not safe to cast to 'CFStringRef' the result of 'autorelease' message; a __bridge cast may result in a pointer to a destroyed object and a __bridge_retained may leak the object
  return (CFStringRef)[[[NSString alloc] init] autorelease];
         ^            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t.m:12:3: note: [rewriter] remove the cast and change return type of function to 'NSString *' to have the object automatically autoreleased
  return (CFStringRef)[[[NSString alloc] init] autorelease];
  ^

- Before changing attributes to weak/unsafe_unretained, check if the backing ivar
  is set to a +1 object, in which case use 'strong' instead.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136208 91177308-0d34-0410-b5e6-96231b3b80d8
21 files changed:
include/clang/AST/ParentMap.h
lib/ARCMigrate/TransAPIUses.cpp
lib/ARCMigrate/TransAutoreleasePool.cpp
lib/ARCMigrate/TransProperties.cpp
lib/ARCMigrate/TransRetainReleaseDealloc.cpp
lib/ARCMigrate/TransUnbridgedCasts.cpp
lib/ARCMigrate/Transforms.cpp
lib/ARCMigrate/Transforms.h
lib/AST/ParentMap.cpp
test/ARCMT/Common.h
test/ARCMT/api.m [new file with mode: 0644]
test/ARCMT/api.m.result [new file with mode: 0644]
test/ARCMT/assign-prop-with-arc-runtime.m
test/ARCMT/assign-prop-with-arc-runtime.m.result
test/ARCMT/atautorelease.m
test/ARCMT/atautorelease.m.result
test/ARCMT/nonobjc-to-objc-cast-2.m
test/ARCMT/nonobjc-to-objc-cast.m
test/ARCMT/nonobjc-to-objc-cast.m.result
test/ARCMT/releases.m
test/ARCMT/releases.m.result