Teach RetainCountChecker about mixing method families with explicit annotations.  Fixes <rdar://problem/10824732>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152448 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
index a59d1e4..a5146b7 100644
--- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
@@ -1192,6 +1192,36 @@
     return;
 
   RetainSummaryTemplate Template(Summ, DefaultSummary, *this);
+  
+  // Check the method family, and apply any default annotations.
+  switch (MD->getMethodFamily()) {
+    case OMF_None:
+      break;
+    case OMF_init:
+      Template->setRetEffect(ObjCInitRetE);
+      Template->setReceiverEffect(DecRefMsg);
+      break;
+    case OMF_alloc:
+    case OMF_new:
+    case OMF_copy:
+    case OMF_mutableCopy:
+      Template->setRetEffect(ObjCAllocRetE);
+      break;
+    case OMF_autorelease:
+      Template->setReceiverEffect(Autorelease);
+    case OMF_retain:
+      Template->setReceiverEffect(IncRefMsg);
+      break;
+    case OMF_release:
+      Template->setReceiverEffect(DecRefMsg);
+      break;
+    case OMF_self:
+    case OMF_performSelector:
+    case OMF_retainCount:
+    case OMF_dealloc:
+    case OMF_finalize:
+      break;
+  }
 
   bool isTrackedLoc = false;