blob: 1f06595f77bec17374705ed3bc28115333500381 [file] [log] [blame]
Alex Denisove1d882c2015-03-04 17:55:52 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s
2
3typedef long int NSUInteger;
4#define nil 0
5@class NSString;
6
7@interface NSMutableArray
8
9- (void)addObject:(id)object;
10- (void)insertObject:(id)object atIndex:(NSUInteger)index;
11- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)object;
12- (void)setObject:(id)object atIndexedSubscript:(NSUInteger)index;
13
14@end
15
16@interface NSMutableDictionary
17
18- (void)setObject:(id)object forKey:(id)key;
19- (void)setObject:(id)object forKeyedSubscript:(id)key;
20- (void)setValue:(id)value forKey:(NSString *)key;
21
22@end
23
24@interface NSMutableSet
25
26- (void)addObject:(id)object;
27
28@end
29
30@interface NSCountedSet : NSMutableSet
31
32@end
33
34@interface NSMutableOrderedSet
35
36- (void)addObject:(id)object;
37- (void)insertObject:(id)object atIndex:(NSUInteger)index;
38- (void)setObject:(id)object atIndexedSubscript:(NSUInteger)index;
39- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)object;
40- (void)setObject:(id)object atIndex:(NSUInteger)index;
41
42@end
43
44@interface SelfRefClass
45{
46 NSMutableArray *_array; // expected-note {{'_array' declared here}}
47 NSMutableDictionary *_dictionary; // expected-note {{'_dictionary' declared here}}
48 NSMutableSet *_set; // expected-note {{'_set' declared here}}
49 NSCountedSet *_countedSet; // expected-note {{'_countedSet' declared here}}
50 NSMutableOrderedSet *_orderedSet; // expected-note {{'_orderedSet' declared here}}
51}
52@end
53
54@implementation SelfRefClass
55
56- (void)check {
57 [_array addObject:_array]; // expected-warning {{adding '_array' to '_array' might cause circular dependency in container}}
58 [_dictionary setObject:_dictionary forKey:@"key"]; // expected-warning {{adding '_dictionary' to '_dictionary' might cause circular dependency in container}}
59 [_set addObject:_set]; // expected-warning {{adding '_set' to '_set' might cause circular dependency in container}}
60 [_countedSet addObject:_countedSet]; // expected-warning {{adding '_countedSet' to '_countedSet' might cause circular dependency in container}}
61 [_orderedSet addObject:_orderedSet]; // expected-warning {{adding '_orderedSet' to '_orderedSet' might cause circular dependency in container}}
62}
63
64- (void)checkNSMutableArray:(NSMutableArray *)a { // expected-note {{'a' declared here}}
65 [a addObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
66}
67
68- (void)checkNSMutableDictionary:(NSMutableDictionary *)d { // expected-note {{'d' declared here}}
69 [d setObject:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
70}
71
72- (void)checkNSMutableSet:(NSMutableSet *)s { // expected-note {{'s' declared here}}
73 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
74}
75
76- (void)checkNSCountedSet:(NSCountedSet *)s { // expected-note {{'s' declared here}}
77 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
78}
79
80- (void)checkNSMutableOrderedSet:(NSMutableOrderedSet *)s { // expected-note {{'s' declared here}}
81 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
82}
83
84@end
85
86void checkNSMutableArrayParam(NSMutableArray *a) { // expected-note {{'a' declared here}}
87 [a addObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
88}
89
90void checkNSMutableDictionaryParam(NSMutableDictionary *d) { // expected-note {{'d' declared here}}
91 [d setObject:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
92}
93
94void checkNSMutableSetParam(NSMutableSet *s) { // expected-note {{'s' declared here}}
95 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
96}
97
98void checkNSCountedSetParam(NSCountedSet *s) { // expected-note {{'s' declared here}}
99 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
100}
101
102void checkNSMutableOrderedSetParam(NSMutableOrderedSet *s) { // expected-note {{'s' declared here}}
103 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
104}
105
106void checkNSMutableArray() {
107 NSMutableArray *a = nil; // expected-note 5 {{'a' declared here}} 5
108
109 [a addObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
110 [a insertObject:a atIndex:0]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
111 [a replaceObjectAtIndex:0 withObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
112 [a setObject:a atIndexedSubscript:0]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
113 a[0] = a; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
114}
115
116void checkNSMutableDictionary() {
117 NSMutableDictionary *d = nil; // expected-note 4 {{'d' declared here}}
118
119 [d setObject:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
120 [d setObject:d forKeyedSubscript:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
121 [d setValue:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
122 d[@"key"] = d; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
123}
124
125void checkNSMutableSet() {
126 NSMutableSet *s = nil; // expected-note {{'s' declared here}}
127
128 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
129}
130
131void checkNSCountedSet() {
132 NSCountedSet *s = nil; // expected-note {{'s' declared here}}
133
134 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
135}
136
137void checkNSMutableOrderedSet() {
138 NSMutableOrderedSet *s = nil; // expected-note 5 {{'s' declared here}}
139
140 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
141 [s insertObject:s atIndex:0]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
142 [s setObject:s atIndex:0]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
143 [s setObject:s atIndexedSubscript:0]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
144 [s replaceObjectAtIndex:0 withObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
145}
146
Alex Denisov5dfac812015-08-06 04:51:14 +0000147// Test subclassing
148
149@interface FootableSet : NSMutableSet
150@end
151
152@implementation FootableSet
153- (void)meth {
154 [super addObject:self]; // expected-warning {{adding 'self' to 'super' might cause circular dependency in container}}
155 [super addObject:nil]; // no-warning
156 [self addObject:self]; // expected-warning {{adding 'self' to 'self' might cause circular dependency in container}}
157}
158@end
159
160@interface FootableArray : NSMutableArray
161@end
162
163@implementation FootableArray
164- (void)meth {
165 [super addObject:self]; // expected-warning {{adding 'self' to 'super' might cause circular dependency in container}}
166 [super addObject:nil]; // no-warning
167 [self addObject:self]; // expected-warning {{adding 'self' to 'self' might cause circular dependency in container}}
168}
169@end
170
171@interface FootableDictionary : NSMutableDictionary
172@end
173
174@implementation FootableDictionary
175- (void)meth {
176 [super setObject:self forKey:@"key"]; // expected-warning {{adding 'self' to 'super' might cause circular dependency in container}}
177 [super setObject:nil forKey:@"key"]; // no-warning
178 [self setObject:self forKey:@"key"]; // expected-warning {{adding 'self' to 'self' might cause circular dependency in container}}
179}
180@end
181
182
183void subclassingNSMutableArray() {
184 FootableArray *a = nil; // expected-note 5 {{'a' declared here}} 5
185
186 [a addObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
187 [a insertObject:a atIndex:0]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
188 [a replaceObjectAtIndex:0 withObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
189 [a setObject:a atIndexedSubscript:0]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
190 a[0] = a; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
191}
192
193void subclassingNSMutableDictionary() {
194 FootableDictionary *d = nil; // expected-note 4 {{'d' declared here}}
195
196 [d setObject:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
197 [d setObject:d forKeyedSubscript:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
198 [d setValue:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
199 d[@"key"] = d; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
200}
201
202void subclassingNSMutableSet() {
203 FootableSet *s = nil; // expected-note {{'s' declared here}}
204
205 [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
206}
207