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