aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp25
-rw-r--r--test/Analysis/objc_invalidation.m4
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
}