summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2013-11-14 01:42:17 +0000
committerTed Kremenek <kremenek@apple.com>2013-11-14 01:42:17 +0000
commitf6171b3cdf2137979979935a16521869b5b498f5 (patch)
tree6660382a0a50bad5a0d77fbf595c1661cf7a3a90
parent5cbcf56a7e45ffe40bd5718355f98fe2b7242abb (diff)
downloadbcm5719-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.cpp22
-rw-r--r--clang/test/SemaObjC/arc-bridged-cast.m12
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
OpenPOWER on IntegriCloud