Add CFG support for @synchronized. This fixes <rdar://problem/6848820>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70620 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/CFG.cpp b/lib/AST/CFG.cpp
index e601d4f..f5b6045 100644
--- a/lib/AST/CFG.cpp
+++ b/lib/AST/CFG.cpp
@@ -140,9 +140,7 @@
// a 'return'.
CFGBlock* VisitObjCAtThrowStmt(ObjCAtThrowStmt* S);
- CFGBlock* VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt* S){
- return NYS();
- }
+ CFGBlock* VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt* S);
// Blocks.
CFGBlock* VisitBlockExpr(BlockExpr* E) { return NYS(); }
@@ -935,6 +933,16 @@
return addStmt(S->getCollection());
}
+CFGBlock* CFGBuilder::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt* S) {
+ // FIXME: Add locking 'primitives' to CFG for @synchronized.
+
+ // Inline the body.
+ Visit(S->getSynchBody());
+
+ // Inline the sync expression.
+ return Visit(S->getSynchExpr());
+}
+
CFGBlock* CFGBuilder::VisitObjCAtTryStmt(ObjCAtTryStmt* S) {
return NYS();
}
diff --git a/test/Analysis/NSString.m b/test/Analysis/NSString.m
index 160c64c..2f6d591 100644
--- a/test/Analysis/NSString.m
+++ b/test/Analysis/NSString.m
@@ -271,3 +271,11 @@
void test_isTrackedObjectType(void) {
NSString *str = [TestIsTracked newString]; // expected-warning{{Potential leak}}
}
+
+// Test @synchronized
+void test_synchronized(id x) {
+ @synchronized(x) {
+ NSString *string = [[NSString stringWithFormat:@"%ld", (long) 100] retain]; // expected-warning {{leak}}
+ }
+}
+