1 | // RUN: %clang_analyze_cc1 -fblocks -analyzer-checker=osx.cocoa.UnusedIvars -verify -Wno-objc-root-class %s |
2 | |
3 | //===--- BEGIN: Delta-debugging reduced headers. --------------------------===// |
4 | |
5 | @protocol NSObject |
6 | - (id)retain; |
7 | - (oneway void)release; |
8 | @end |
9 | @interface NSObject <NSObject> {} |
10 | - (id)init; |
11 | + (id)alloc; |
12 | @end |
13 | |
14 | //===--- END: Delta-debugging reduced headers. ----------------------------===// |
15 | |
16 | // This test case tests the basic functionality of the unused ivar test. |
17 | @interface TestA { |
18 | @private |
19 | int x; // expected-warning {{Instance variable 'x' in class 'TestA' is never used}} |
20 | } |
21 | @end |
22 | @implementation TestA @end |
23 | |
24 | // This test case tests whether the unused ivar check handles blocks that |
25 | // reference an instance variable. (<rdar://problem/7075531>) |
26 | @interface TestB : NSObject { |
27 | @private |
28 | id _ivar; // no-warning |
29 | } |
30 | @property (readwrite,retain) id ivar; |
31 | @end |
32 | |
33 | @implementation TestB |
34 | - (id)ivar { |
35 | __attribute__((__blocks__(byref))) id value = ((void*)0); |
36 | void (^b)() = ^{ value = _ivar; }; |
37 | b(); |
38 | return value; |
39 | } |
40 | |
41 | - (void)setIvar:(id)newValue { |
42 | void (^b)() = ^{ [_ivar release]; _ivar = [newValue retain]; }; |
43 | b(); |
44 | } |
45 | @end |
46 | |
47 | //===----------------------------------------------------------------------===// |
48 | // <rdar://problem/6260004> Detect that ivar is in use, if used in category |
49 | // in the same file as the implementation |
50 | //===----------------------------------------------------------------------===// |
51 | |
52 | @protocol Protocol6260004 |
53 | - (id) getId; |
54 | @end |
55 | |
56 | @interface RDar6260004 { |
57 | @private |
58 | id x; // no-warning |
59 | } |
60 | @end |
61 | @implementation RDar6260004 @end |
62 | @implementation RDar6260004 (Protocol6260004) |
63 | - (id) getId { |
64 | return x; |
65 | } |
66 | @end |
67 | |
68 | //===----------------------------------------------------------------------===// |
69 | // <rdar://problem/7254495> - ivars referenced by lexically nested functions |
70 | // should not be flagged as unused |
71 | //===----------------------------------------------------------------------===// |
72 | |
73 | @interface RDar7254495 { |
74 | @private |
75 | int x; // no-warning |
76 | } |
77 | @end |
78 | |
79 | @implementation RDar7254495 |
80 | int radar_7254495(RDar7254495 *a) { |
81 | return a->x; |
82 | } |
83 | @end |
84 | |
85 | //===----------------------------------------------------------------------===// |
86 | // <rdar://problem/7353683> - consult attribute((unused)) to silence warnings |
87 | // about unused instance variables |
88 | //===----------------------------------------------------------------------===// |
89 | |
90 | @interface RDar7353683 { |
91 | @private |
92 | id x __attribute__((unused)); |
93 | } |
94 | @end |
95 | |
96 | @implementation RDar7353683 |
97 | @end |
98 | //===----------------------------------------------------------------------===// |
99 | // <rdar://problem/8481311> Unused bitfield ivars trigger cause weird |
100 | // diagnostic: "Instance variable '' in class..." |
101 | //===----------------------------------------------------------------------===// |
102 | |
103 | @interface RDar8481311 { |
104 | @private |
105 | unsigned bitfield:1; // expected-warning {{Instance variable 'bitfield' in class 'RDar8481311' is never used}} |
106 | } |
107 | @end |
108 | |
109 | @implementation RDar8481311 |
110 | @end |
111 | |
112 | @class NSString; |
113 | @interface Radar11059352_1 { |
114 | @private |
115 | NSString *_pathString; |
116 | } |
117 | @property (readonly, strong) NSString *pathString; |
118 | @end |
119 | |
120 | @interface Radar11059352 { |
121 | @private |
122 | Radar11059352_1 *_workspacePath; |
123 | } |
124 | @end |
125 | |
126 | @implementation Radar11059352 |
127 | |
128 | - (void)useWorkspace { |
129 | NSString *workspacePathString = _workspacePath.pathString; |
130 | } |
131 | @end |