1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core -analyzer-checker=deadcode.DeadStores,osx.cocoa.RetainCount -fblocks -verify -Wno-objc-root-class %s 2*67e74705SXin Li// expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Litypedef signed char BOOL; 5*67e74705SXin Litypedef unsigned int NSUInteger; 6*67e74705SXin Litypedef struct _NSZone NSZone; 7*67e74705SXin Li@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 8*67e74705SXin Li@protocol NSObject - (BOOL)isEqual:(id)object; @end 9*67e74705SXin Li@protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end 10*67e74705SXin Li@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end 11*67e74705SXin Li@interface NSObject <NSObject> {} @end 12*67e74705SXin Liextern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone); 13*67e74705SXin Li@interface NSValue : NSObject <NSCopying, NSCoding> - (void)getValue:(void *)value; @end 14*67e74705SXin Litypedef float CGFloat; 15*67e74705SXin Litypedef struct _NSPoint {} NSRange; 16*67e74705SXin Li@interface NSValue (NSValueRangeExtensions) + (NSValue *)valueWithRange:(NSRange)range; 17*67e74705SXin Li- (BOOL)containsObject:(id)anObject; 18*67e74705SXin Li@end 19*67e74705SXin Li@class NSURLAuthenticationChallenge; 20*67e74705SXin Li@interface NSResponder : NSObject <NSCoding> {} @end 21*67e74705SXin Li@class NSArray, NSDictionary, NSString; 22*67e74705SXin Li@interface NSObject (NSKeyValueBindingCreation) 23*67e74705SXin Li+ (void)exposeBinding:(NSString *)binding; 24*67e74705SXin Li- (NSArray *)exposedBindings; 25*67e74705SXin Li@end 26*67e74705SXin Liextern NSString *NSAlignmentBinding; 27*67e74705SXin Li 28*67e74705SXin Li// This test case was reported as a false positive due to a bug in the 29*67e74705SXin Li// LiveVariables <-> deadcode.DeadStores interplay. We should not flag a warning 30*67e74705SXin Li// here. The test case was reported in: 31*67e74705SXin Li// http://lists.llvm.org/pipermail/cfe-dev/2008-July/002157.html 32*67e74705SXin Livoid DeadStoreTest(NSObject *anObject) { 33*67e74705SXin Li NSArray *keys; 34*67e74705SXin Li if ((keys = [anObject exposedBindings]) && // no-warning 35*67e74705SXin Li ([keys containsObject:@"name"] && [keys containsObject:@"icon"])) {} 36*67e74705SXin Li} 37*67e74705SXin Li 38*67e74705SXin Li// This test case was a false positive due to how clang models 39*67e74705SXin Li// pointer types and ObjC object pointer types differently. Here 40*67e74705SXin Li// we don't warn about a dead store because 'nil' is assigned to 41*67e74705SXin Li// an object pointer for the sake of defensive programming. 42*67e74705SXin Livoid rdar_7631278(NSObject *x) { 43*67e74705SXin Li x = ((void*)0); 44*67e74705SXin Li} 45*67e74705SXin Li 46*67e74705SXin Li// This test case issuing a bogus warning for the declaration of 'isExec' 47*67e74705SXin Li// because the compound statement for the @synchronized was being visited 48*67e74705SXin Li// twice by the LiveVariables analysis. 49*67e74705SXin LiBOOL baz_rdar8527823(); 50*67e74705SXin Livoid foo_rdar8527823(); 51*67e74705SXin Li@interface RDar8527823 52*67e74705SXin Li- (void) bar_rbar8527823; 53*67e74705SXin Li@end 54*67e74705SXin Li@implementation RDar8527823 55*67e74705SXin Li- (void) bar_rbar8527823 56*67e74705SXin Li{ 57*67e74705SXin Li @synchronized(self) { 58*67e74705SXin Li BOOL isExec = baz_rdar8527823(); // no-warning 59*67e74705SXin Li if (isExec) foo_rdar8527823(); 60*67e74705SXin Li } 61*67e74705SXin Li} 62*67e74705SXin Li@end 63*67e74705SXin Li 64*67e74705SXin Li// Don't flag dead stores to assignments to self within a nested assignment. 65*67e74705SXin Li@interface Rdar7947686 66*67e74705SXin Li- (id) init; 67*67e74705SXin Li@end 68*67e74705SXin Li 69*67e74705SXin Li@interface Rdar7947686_B : Rdar7947686 70*67e74705SXin Li- (id) init; 71*67e74705SXin Li@end 72*67e74705SXin Li 73*67e74705SXin Li@implementation Rdar7947686_B 74*67e74705SXin Li- (id) init { 75*67e74705SXin Li id x = (self = [super init]); // no-warning 76*67e74705SXin Li return x; 77*67e74705SXin Li} 78*67e74705SXin Li@end 79*67e74705SXin Li 80*67e74705SXin Li// Don't flag dead stores when a variable is captured in a block used 81*67e74705SXin Li// by a property access. 82*67e74705SXin Li@interface RDar10591355 83*67e74705SXin Li@property (assign) int x; 84*67e74705SXin Li@end 85*67e74705SXin Li 86*67e74705SXin LiRDar10591355 *rdar10591355_aux(); 87*67e74705SXin Li 88*67e74705SXin Livoid rdar10591355() { 89*67e74705SXin Li RDar10591355 *p = rdar10591355_aux(); 90*67e74705SXin Li ^{ (void) p.x; }(); 91*67e74705SXin Li} 92*67e74705SXin Li 93*67e74705SXin Li@interface Radar11059352_1 { 94*67e74705SXin Li@private 95*67e74705SXin Li int *_pathString; 96*67e74705SXin Li} 97*67e74705SXin Li@property int *pathString; 98*67e74705SXin Li@end 99*67e74705SXin Li@interface Radar11059352 { 100*67e74705SXin Li@private 101*67e74705SXin LiRadar11059352_1 *_Path; 102*67e74705SXin Li} 103*67e74705SXin Li@end 104*67e74705SXin Li@implementation Radar11059352 105*67e74705SXin Li 106*67e74705SXin Li- (int*)usePath { 107*67e74705SXin Li Radar11059352_1 *xxxxx = _Path; // no warning 108*67e74705SXin Li int *wp = xxxxx.pathString; 109*67e74705SXin Li return wp; 110*67e74705SXin Li} 111*67e74705SXin Li@end 112*67e74705SXin Li 113*67e74705SXin Liid test_objc_precise_lifetime_foo(); 114*67e74705SXin Livoid test_objc_precise_lifetime() { 115*67e74705SXin Li __attribute__((objc_precise_lifetime)) id dead = test_objc_precise_lifetime_foo(); // no-warning 116*67e74705SXin Li dead = 0; 117*67e74705SXin Li dead = test_objc_precise_lifetime_foo(); // no-warning 118*67e74705SXin Li dead = 0; 119*67e74705SXin Li} 120