summaryrefslogtreecommitdiff
path: root/test/Analysis/unused-ivars.m
blob: 8f12d9b18a7d3a8f8256852ca0fc0a6b14d00349 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// RUN: %clang_analyze_cc1 -fblocks -analyzer-checker=osx.cocoa.UnusedIvars -verify -Wno-objc-root-class %s

//===--- 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

// 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

//===----------------------------------------------------------------------===//
// <rdar://problem/6260004> Detect that ivar is in use, if used in category 
//  in the same file as the implementation
//===----------------------------------------------------------------------===//

@protocol Protocol6260004
- (id) getId;
@end

@interface RDar6260004 {
@private
  id x; // no-warning
}
@end
@implementation RDar6260004 @end
@implementation RDar6260004 (Protocol6260004)
- (id) getId {
  return x;
}
@end

//===----------------------------------------------------------------------===//
// <rdar://problem/7254495> - ivars referenced by lexically nested functions
//  should not be flagged as unused
//===----------------------------------------------------------------------===//

@interface RDar7254495 {
@private
  int x; // no-warning
}
@end

@implementation RDar7254495
int radar_7254495(RDar7254495 *a) {
  return a->x;
}
@end

//===----------------------------------------------------------------------===//
// <rdar://problem/7353683> - consult attribute((unused)) to silence warnings
// about unused instance variables
//===----------------------------------------------------------------------===//

@interface RDar7353683 {
@private
  id x __attribute__((unused));
}
@end

@implementation RDar7353683
@end
//===----------------------------------------------------------------------===//
// <rdar://problem/8481311> Unused bitfield ivars trigger cause weird
// diagnostic: "Instance variable '' in class..."
//===----------------------------------------------------------------------===//

@interface RDar8481311 {
@private
    unsigned bitfield:1; // expected-warning {{Instance variable 'bitfield' in class 'RDar8481311' is never used}}
}
@end

@implementation RDar8481311
@end

@class NSString;
@interface Radar11059352_1 {
@private
    NSString *_pathString;
}
@property (readonly, strong) NSString *pathString;
@end

@interface Radar11059352 {
@private
Radar11059352_1 *_workspacePath;
}
@end

@implementation Radar11059352

- (void)useWorkspace {
    NSString *workspacePathString = _workspacePath.pathString;
}
@end