Add two new checker-specific attributes: 'objc_ownership_release' and
'objc_ownership_cfrelease'. These are the 'release' equivalents of
'objc_ownership_retain' and 'objc_ownership_cfretain' respectively.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70235 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index 8f07b2c..538f4f2 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -1112,7 +1112,15 @@
     else if ((*I)->getAttr<ObjCOwnershipCFRetainAttr>()) {
       ScratchArgs.push_back(std::make_pair(i, IncRef));
       hasArgEffect = true;
-    }    
+    }
+    else if ((*I)->getAttr<ObjCOwnershipReleaseAttr>()) {
+      ScratchArgs.push_back(std::make_pair(i, DecRefMsg));
+      hasArgEffect = true;
+    }
+    else if ((*I)->getAttr<ObjCOwnershipCFReleaseAttr>()) {
+      ScratchArgs.push_back(std::make_pair(i, DecRef));
+      hasArgEffect = true;
+    }
   }
   
   if (!hasRetEffect && !hasArgEffect)
diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp
index 50cc031..2df87bf 100644
--- a/lib/Frontend/PCHReaderDecl.cpp
+++ b/lib/Frontend/PCHReaderDecl.cpp
@@ -475,6 +475,8 @@
 
     SIMPLE_ATTR(ObjCException);
     SIMPLE_ATTR(ObjCNSObject);
+    SIMPLE_ATTR(ObjCOwnershipCFRelease);
+    SIMPLE_ATTR(ObjCOwnershipRelease);
     SIMPLE_ATTR(ObjCOwnershipCFRetain);
     SIMPLE_ATTR(ObjCOwnershipRetain);
     SIMPLE_ATTR(ObjCOwnershipReturns);
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp
index bb85b68..8ff688e 100644
--- a/lib/Frontend/PCHWriter.cpp
+++ b/lib/Frontend/PCHWriter.cpp
@@ -1539,6 +1539,8 @@
 
     case Attr::ObjCException:
     case Attr::ObjCNSObject:
+    case Attr::ObjCOwnershipCFRelease:
+    case Attr::ObjCOwnershipRelease:
     case Attr::ObjCOwnershipCFRetain:
     case Attr::ObjCOwnershipRetain:
     case Attr::ObjCOwnershipReturns:
diff --git a/lib/Parse/AttributeList.cpp b/lib/Parse/AttributeList.cpp
index 9e46159..cbc0031 100644
--- a/lib/Parse/AttributeList.cpp
+++ b/lib/Parse/AttributeList.cpp
@@ -140,6 +140,8 @@
   case 22:
     if (!memcmp(Str, "objc_ownership_returns", 22))
       return AT_objc_ownership_returns;
+    if (!memcmp(Str, "objc_ownership_release", 22))
+      return AT_objc_ownership_release;
     if (!memcmp(Str, "no_instrument_function", 22))
       return AT_no_instrument_function;
     break;
@@ -147,6 +149,10 @@
     if (!memcmp(Str, "objc_ownership_cfretain", 23))
       return AT_objc_ownership_cfretain;
     break;
-  }
+  case 24:
+    if (!memcmp(Str, "objc_ownership_cfrelease", 24))
+      return AT_objc_ownership_cfrelease;
+    break;
+  }  
   return UnknownAttribute;
 }
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp
index cf722e5..c72b7ad 100644
--- a/lib/Sema/SemaDeclAttr.cpp
+++ b/lib/Sema/SemaDeclAttr.cpp
@@ -1543,6 +1543,10 @@
       default:
         assert(0 && "invalid ownership attribute");
         return;
+      case AttributeList::AT_objc_ownership_release:
+        name = "objc_ownership_release"; break;
+      case AttributeList::AT_objc_ownership_cfrelease:
+        name = "objc_ownership_cfrelease"; break;        
       case AttributeList::AT_objc_ownership_retain:
         name = "objc_ownership_retain"; break;
       case AttributeList::AT_objc_ownership_cfretain:
@@ -1558,6 +1562,10 @@
     default:
       assert(0 && "invalid ownership attribute");
       return;
+    case AttributeList::AT_objc_ownership_release:
+      d->addAttr(::new (S.Context) ObjCOwnershipReleaseAttr());   return;
+    case AttributeList::AT_objc_ownership_cfrelease:
+      d->addAttr(::new (S.Context) ObjCOwnershipCFReleaseAttr()); return;      
     case AttributeList::AT_objc_ownership_retain:
       d->addAttr(::new (S.Context) ObjCOwnershipRetainAttr());   return;
     case AttributeList::AT_objc_ownership_cfretain:
@@ -1603,6 +1611,8 @@
   case AttributeList::AT_nothrow:     HandleNothrowAttr   (D, Attr, S); break;
 
   // Checker-specific.
+  case AttributeList::AT_objc_ownership_release:
+  case AttributeList::AT_objc_ownership_cfrelease:
   case AttributeList::AT_objc_ownership_retain:
   case AttributeList::AT_objc_ownership_cfretain:
     HandleObjCOwnershipParmAttr(D, Attr, S); break;