diff options
author | Ted Kremenek <kremenek@apple.com> | 2013-11-14 01:42:17 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2013-11-14 01:42:17 +0000 |
commit | f6171b3cdf2137979979935a16521869b5b498f5 (patch) | |
tree | 6660382a0a50bad5a0d77fbf595c1661cf7a3a90 | |
parent | 5cbcf56a7e45ffe40bd5718355f98fe2b7242abb (diff) | |
download | bcm5719-llvm-f6171b3cdf2137979979935a16521869b5b498f5.tar.gz bcm5719-llvm-f6171b3cdf2137979979935a16521869b5b498f5.zip |
Suppress -Wunused-variable when initializer uses bridge casts for memory management.
Fixes <rdar://problem/15432770>.
llvm-svn: 194647
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 22 | ||||
-rw-r--r-- | clang/test/SemaObjC/arc-bridged-cast.m | 12 |
2 files changed, 34 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 9281951a814..a7b37c55e92 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1313,6 +1313,28 @@ static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) { } } + // Under ARC, bridged casts can have side-effects on memory + // management semantics. Some users assign a bridged + // value to a temporary to adjust reference counts. + const Expr *Init = VD->getInit(); + if (Init) { + if (const ExprWithCleanups *EC = dyn_cast<ExprWithCleanups>(Init)) + Init = EC->getSubExpr(); + Init = Init->IgnoreParens(); + if (const ImplicitCastExpr *IC = dyn_cast<ImplicitCastExpr>(Init)) { + switch (IC->getCastKind()) { + case CK_ARCProduceObject: + case CK_ARCConsumeObject: + case CK_ARCReclaimReturnedObject: + case CK_ARCExtendBlockObject: + case CK_CopyAndAutoreleaseBlockObject: + return false; + default: + break; + } + } + } + // TODO: __attribute__((unused)) templates? } diff --git a/clang/test/SemaObjC/arc-bridged-cast.m b/clang/test/SemaObjC/arc-bridged-cast.m index 439d3821165..6f5f3782d52 100644 --- a/clang/test/SemaObjC/arc-bridged-cast.m +++ b/clang/test/SemaObjC/arc-bridged-cast.m @@ -62,3 +62,15 @@ CFTypeRef fixitsWithSpace(id obj) { // CHECK: fix-it:"{{.*}}":{59:9-59:9}:"(__bridge CFTypeRef)" // CHECK: fix-it:"{{.*}}":{59:9-59:9}:" CFBridgingRetain" } + +// <rdar://problem/15432770> +// Suppressed -Wunused-variable when the initializer is a bridge cast. +#pragma clang diagnostic push +#pragma clang diagnostic warning "-Wunused-variable" +void rdar15432770() { + void (^block1)() = ^ { }; + void *ptr = (__bridge_retained void *)(block1); + void (^block2)() = (__bridge_transfer void(^)())ptr; // no-warning + int x = 1; // expected-warning {{unused variable}} +} +#pragma clang diagnostic pop |