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