diff options
-rw-r--r-- | lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp | 25 | ||||
-rw-r--r-- | test/Analysis/objc_invalidation.m | 4 |
2 files changed, 15 insertions, 14 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); } diff --git a/test/Analysis/objc_invalidation.m b/test/Analysis/objc_invalidation.m index 1b29d36ef4..a6f5ec3f84 100644 --- a/test/Analysis/objc_invalidation.m +++ b/test/Analysis/objc_invalidation.m @@ -250,7 +250,7 @@ extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, @interface MissingInvalidationMethod : Foo <FooBar_Protocol> @property (assign) MissingInvalidationMethod *foobar15_warn; -#if RUN_MISSING_INVALIDATION_METHOD +#if RUN_IVAR_INVALIDATION // expected-warning@-2 {{Property foobar15_warn needs to be invalidated; no invalidation method is defined in the @implementation for MissingInvalidationMethod}} #endif @end @@ -259,7 +259,7 @@ extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, @interface MissingInvalidationMethod2 : Foo <FooBar_Protocol> { Foo *Ivar1; -#if RUN_MISSING_INVALIDATION_METHOD +#if RUN_IVAR_INVALIDATION // expected-warning@-2 {{Instance variable Ivar1 needs to be invalidated; no invalidation method is defined in the @implementation for MissingInvalidationMethod2}} #endif } |