diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-07-14 21:26:49 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-07-14 21:26:49 +0000 |
| commit | 84b528f3b141c0517f427830c867f3710a0ff931 (patch) | |
| tree | fcd1fab894bb2651ab318b747a846d72038412bd /clang/lib/ARCMigrate | |
| parent | 26e7449443980592a5821cd61b5d9fe46bf8f285 (diff) | |
| download | bcm5719-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.cpp | 16 |
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()); |

