[analyzer] Ivar invalidation: identify properties declared in protocols.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166211 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp b/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
index e52e3d4..bf256cd 100644
--- a/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp
@@ -327,10 +327,13 @@
   MethToIvarMapTy PropGetterToIvarMap;
   PropToIvarMapTy PropertyToIvarMap;
   IvarToPropMapTy IvarToPopertyMap;
-  for (ObjCInterfaceDecl::prop_iterator
-      I = InterfaceD->prop_begin(),
-      E = InterfaceD->prop_end(); I != E; ++I) {
-    const ObjCPropertyDecl *PD = *I;
+
+  ObjCInterfaceDecl::PropertyMap PropMap;
+  InterfaceD->collectPropertiesToImplement(PropMap);
+
+  for (ObjCInterfaceDecl::PropertyMap::iterator
+      I = PropMap.begin(), E = PropMap.end(); I != E; ++I) {
+    const ObjCPropertyDecl *PD = I->second;
 
     const ObjCIvarDecl *ID = findPropertyBackingIvar(PD, InterfaceD, Ivars);
     if (!ID) {
@@ -386,7 +389,8 @@
         const ObjCPropertyDecl *PD = IvarToPopertyMap[IvarDecl];
         assert(PD &&
                "Do we synthesize ivars for something other than properties?");
-        os << "Property "<< PD->getName() << " needs to be invalidated";
+        os << "Property "<< PD->getName() <<
+              " needs to be invalidated or set to nil";
       } else {
         os << "Instance variable "<< IvarDecl->getName()
              << " needs to be invalidated or set to nil";