summaryrefslogtreecommitdiffstats
path: root/clang/lib/ARCMigrate
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-07-14 21:26:49 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-07-14 21:26:49 +0000
commit84b528f3b141c0517f427830c867f3710a0ff931 (patch)
treefcd1fab894bb2651ab318b747a846d72038412bd /clang/lib/ARCMigrate
parent26e7449443980592a5821cd61b5d9fe46bf8f285 (diff)
downloadbcm5719-llvm-84b528f3b141c0517f427830c867f3710a0ff931.tar.gz
bcm5719-llvm-84b528f3b141c0517f427830c867f3710a0ff931.zip
[arcmt] Emit an error for unused -autorelease messages.
An unused autorelease is badness. If we remove it the receiver will likely die immediately while previously it was kept alive by the autorelease pool. This is bad practice in general, so leave it and emit an error to force the user to restructure his code. rdar://9599884 llvm-svn: 135193
Diffstat (limited to 'clang/lib/ARCMigrate')
-rw-r--r--clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp b/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp
index fe80a43a6ae..d64250faf02 100644
--- a/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp
+++ b/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp
@@ -52,14 +52,26 @@ public:
switch (E->getMethodFamily()) {
default:
return true;
+ case OMF_autorelease:
+ if (isRemovable(E)) {
+ // An unused autorelease is badness. If we remove it the receiver
+ // will likely die immediately while previously it was kept alive
+ // by the autorelease pool. This is bad practice in general, leave it
+ // and emit an error to force the user to restructure his code.
+ std::string err = "it is not safe to remove an unused '";
+ err += E->getSelector().getAsString() + "'; its receiver may be "
+ "destroyed immediately";
+ Pass.TA.reportError(err, E->getLocStart(), E->getSourceRange());
+ return true;
+ }
+ // Pass through.
case OMF_retain:
case OMF_release:
- case OMF_autorelease:
if (E->getReceiverKind() == ObjCMessageExpr::Instance)
if (Expr *rec = E->getInstanceReceiver()) {
rec = rec->IgnoreParenImpCasts();
if (rec->getType().getObjCLifetime() == Qualifiers::OCL_ExplicitNone){
- std::string err = "It is not safe to remove '";
+ std::string err = "it is not safe to remove '";
err += E->getSelector().getAsString() + "' message on "
"an __unsafe_unretained type";
Pass.TA.reportError(err, rec->getLocStart());
OpenPOWER on IntegriCloud