Implement attribute 'ns_autorelease'.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70990 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index 07dbf10..ca42000 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -779,8 +779,8 @@
   RetainSummary* getCommonMethodSummary(const ObjCMethodDecl* MD,
                                         Selector S, QualType RetTy);
 
-  void updateSummaryArgEffFromAnnotations(RetainSummary &Summ, unsigned i,
-                                          const ParmVarDecl *PD);
+  void updateSummaryArgEffFromAnnotations(RetainSummary &Summ, const Decl *D,
+                                          unsigned argIdx = 0);
 
   void updateSummaryFromAnnotations(RetainSummary &Summ,
                                     const ObjCMethodDecl *MD);
@@ -1097,22 +1097,32 @@
   // 'init' methods only return an alias if the return type is a location type.
   return getPersistentSummary(Loc::IsLocType(RetTy)
                               ? RetEffect::MakeReceiverAlias()
-                              : RetEffect::MakeNoRet());  
+                              : RetEffect::MakeNoRet());
 }
 
-
 void
 RetainSummaryManager::updateSummaryArgEffFromAnnotations(RetainSummary &Summ,
-                                                         unsigned i,
-                                                         const ParmVarDecl *PD){
-  if (PD->getAttr<NSOwnershipRetainAttr>())
-    Summ.setArgEffect(AF, i, IncRefMsg);
-  else if (PD->getAttr<CFOwnershipRetainAttr>())
-    Summ.setArgEffect(AF, i, IncRef);
-  else if (PD->getAttr<NSOwnershipReleaseAttr>())
-    Summ.setArgEffect(AF, i, DecRefMsg);
-  else if (PD->getAttr<CFOwnershipReleaseAttr>())
-    Summ.setArgEffect(AF, i, DecRef);
+                                                         const Decl *D,
+                                                         unsigned i) {
+  ArgEffect E = DoNothing;
+  
+  if (D->getAttr<NSOwnershipRetainAttr>())
+    E = IncRefMsg;
+  else if (D->getAttr<CFOwnershipRetainAttr>())
+    E = IncRef;
+  else if (D->getAttr<NSOwnershipReleaseAttr>())
+    E = DecRefMsg;
+  else if (D->getAttr<CFOwnershipReleaseAttr>())
+    E = DecRef;
+  else if (D->getAttr<NSOwnershipAutoreleaseAttr>())
+    E = Autorelease;
+  else
+    return;
+  
+  if (isa<ParmVarDecl>(D))
+    Summ.setArgEffect(AF, i, E);
+  else
+    Summ.setReceiverEffect(E);
 }
 
 void
@@ -1137,7 +1147,7 @@
   unsigned i = 0;
   for (FunctionDecl::param_const_iterator I = FD->param_begin(),
        E = FD->param_end(); I != E; ++I, ++i)
-    updateSummaryArgEffFromAnnotations(Summ, i, *I);
+    updateSummaryArgEffFromAnnotations(Summ, *I, i);
 }
   
 void
@@ -1162,13 +1172,10 @@
   unsigned i = 0;
   for (ObjCMethodDecl::param_iterator I = MD->param_begin(),
        E = MD->param_end(); I != E; ++I, ++i)
-    updateSummaryArgEffFromAnnotations(Summ, i, *I);
+    updateSummaryArgEffFromAnnotations(Summ, *I, i);
   
   // Determine any effects on the receiver.
-  if (MD->getAttr<NSOwnershipRetainAttr>())
-    Summ.setReceiverEffect(IncRefMsg);
-  else if (MD->getAttr<NSOwnershipReleaseAttr>())
-    Summ.setReceiverEffect(DecRefMsg);
+  updateSummaryArgEffFromAnnotations(Summ, MD);
 }
 
 RetainSummary*