diff options
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp b/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp index 6262cb8ef9..0389cc551b 100644 --- a/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp @@ -51,8 +51,7 @@ struct ChecksFilter { DefaultBool check_InstanceVariableInvalidation; }; -class IvarInvalidationCheckerImpl : - public Checker<check::ASTDecl<ObjCImplementationDecl> > { +class IvarInvalidationCheckerImpl { typedef llvm::SmallSetVector<const ObjCMethodDecl*, 2> MethodSet; typedef llvm::DenseMap<const ObjCMethodDecl*, @@ -471,12 +470,20 @@ visit(const ObjCImplementationDecl *ImplD) const { containsInvalidationMethod(InterfaceD, Info, /*LookForPartial*/ false); // Report an error in case none of the invalidation methods are declared. - if (!Info.needsInvalidation() && Filter.check_MissingInvalidationMethod) { - reportNoInvalidationMethod(FirstIvarDecl, IvarToPopertyMap, InterfaceD, - /*MissingDeclaration*/ true); + if (!Info.needsInvalidation()) { + if (Filter.check_MissingInvalidationMethod) + reportNoInvalidationMethod(FirstIvarDecl, IvarToPopertyMap, InterfaceD, + /*MissingDeclaration*/ true); + // If there are no invalidation methods, there is no ivar validation work + // to be done. return; } + // Only check if Ivars are invalidated when InstanceVariableInvalidation + // has been requested. + if (!Filter.check_InstanceVariableInvalidation) + return; + // Check that all ivars are invalidated by the invalidation methods. bool AtImplementationContainsAtLeastOneInvalidationMethod = false; for (MethodSet::iterator I = Info.InvalidationMethods.begin(), @@ -489,11 +496,6 @@ visit(const ObjCImplementationDecl *ImplD) const { if (D && D->hasBody()) { AtImplementationContainsAtLeastOneInvalidationMethod = true; - // Only check if Ivars are invalidated when InstanceVariableInvalidation - // has been requested. - if (!Filter.check_InstanceVariableInvalidation) - break; - // Get a copy of ivars needing invalidation. IvarSet IvarsI = Ivars; @@ -517,8 +519,7 @@ visit(const ObjCImplementationDecl *ImplD) const { } // Report an error in case none of the invalidation methods are implemented. - if (!AtImplementationContainsAtLeastOneInvalidationMethod && - Filter.check_MissingInvalidationMethod) + if (!AtImplementationContainsAtLeastOneInvalidationMethod) reportNoInvalidationMethod(FirstIvarDecl, IvarToPopertyMap, InterfaceD, /*MissingDeclaration*/ false); } |