diff options
author | Anna Zaks <ganna@apple.com> | 2013-01-11 03:52:37 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-01-11 03:52:37 +0000 |
commit | 2975cf27e465de75dd1b9866244cdda0539785d2 (patch) | |
tree | 967e7437b0a891206f44c19eb2cdfed2bdb017c1 /clang/lib | |
parent | 2500e767a0926b57079acbf15185502c56108344 (diff) | |
download | bcm5719-llvm-2975cf27e465de75dd1b9866244cdda0539785d2.tar.gz bcm5719-llvm-2975cf27e465de75dd1b9866244cdda0539785d2.zip |
[analyzer] Ivar invalidation: track ivars declared in categories.
llvm-svn: 172168
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp index 80cb58d76b8..527470a17c5 100644 --- a/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp @@ -227,15 +227,23 @@ void IvarInvalidationChecker::containsInvalidationMethod( } // If interface, check all parent protocols and super. - // TODO: Visit all categories in case the invalidation method is declared in - // a category. - if (const ObjCInterfaceDecl *InterfaceD = dyn_cast<ObjCInterfaceDecl>(D)) { + if (const ObjCInterfaceDecl *InterfD = dyn_cast<ObjCInterfaceDecl>(D)) { + + // Visit all protocols. for (ObjCInterfaceDecl::protocol_iterator - I = InterfaceD->protocol_begin(), - E = InterfaceD->protocol_end(); I != E; ++I) { + I = InterfD->protocol_begin(), + E = InterfD->protocol_end(); I != E; ++I) { containsInvalidationMethod(*I, OutInfo); } - containsInvalidationMethod(InterfaceD->getSuperClass(), OutInfo); + + // Visit all categories in case the invalidation method is declared in + // a category. + for (const ObjCCategoryDecl *I = InterfD->getFirstClassExtension(); I; + I = I->getNextClassExtension()) { + containsInvalidationMethod(I, OutInfo); + } + + containsInvalidationMethod(InterfD->getSuperClass(), OutInfo); return; } @@ -249,7 +257,7 @@ void IvarInvalidationChecker::containsInvalidationMethod( return; } - llvm_unreachable("One of the casts above should have succeeded."); + return; } bool IvarInvalidationChecker::trackIvar(const ObjCIvarDecl *Iv, |