Skip to content
Snippets Groups Projects
Commit 0e8e1fde authored by Ted Kremenek's avatar Ted Kremenek
Browse files

Fix: <rdar://problem/7075531> static analyzer wrongly detects unused ivars used in blocks

llvm-svn: 78409
parent d0470d74
No related branches found
No related tags found
No related merge requests found
......@@ -30,14 +30,20 @@ static void Scan(IvarUsageMap& M, const Stmt* S) {
if (!S)
return;
if (const ObjCIvarRefExpr* Ex = dyn_cast<ObjCIvarRefExpr>(S)) {
const ObjCIvarDecl* D = Ex->getDecl();
if (const ObjCIvarRefExpr *Ex = dyn_cast<ObjCIvarRefExpr>(S)) {
const ObjCIvarDecl *D = Ex->getDecl();
IvarUsageMap::iterator I = M.find(D);
if (I != M.end())
I->second = Used;
return;
}
// Blocks can reference an instance variable of a class.
if (const BlockExpr *BE = dyn_cast<BlockExpr>(S)) {
Scan(M, BE->getBody());
return;
}
for (Stmt::const_child_iterator I=S->child_begin(),E=S->child_end(); I!=E;++I)
Scan(M, *I);
}
......
// RUN: clang-cc -analyze -warn-objc-unused-ivars %s -verify
// RUN: clang-cc -triple x86_64-apple-darwin10 -analyze -warn-objc-unused-ivars %s -verify
@interface A
{
@private int x; // expected-warning {{Instance variable 'x' in class 'A' is never used}}
//===--- BEGIN: Delta-debugging reduced headers. --------------------------===//
@protocol NSObject
- (id)retain;
- (oneway void)release;
@end
@interface NSObject <NSObject> {}
- (id)init;
+ (id)alloc;
@end
//===--- END: Delta-debugging reduced headers. ----------------------------===//
// This test case tests the basic functionality of the unused ivar test.
@interface TestA {
@private
int x; // expected-warning {{Instance variable 'x' in class 'TestA' is never used}}
}
@end
@implementation TestA @end
@implementation A @end
// This test case tests whether the unused ivar check handles blocks that
// reference an instance variable. (<rdar://problem/7075531>)
@interface TestB : NSObject {
@private
id _ivar; // no-warning
}
@property (readwrite,retain) id ivar;
@end
@implementation TestB
- (id)ivar {
__attribute__((__blocks__(byref))) id value = ((void*)0);
void (^b)() = ^{ value = _ivar; };
b();
return value;
}
- (void)setIvar:(id)newValue {
void (^b)() = ^{ [_ivar release]; _ivar = [newValue retain]; };
b();
}
@end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment