1// 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
147// 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
208