1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s |
2 | |
3 | typedef 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 | |
86 | void 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 | |
90 | void 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 | |
94 | void 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 | |
98 | void 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 | |
102 | void 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 | |
106 | void 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 | |
116 | void 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 | |
125 | void 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 | |
131 | void 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 | |
137 | void 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 | |
183 | void 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 | |
193 | void 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 | |
202 | void 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 | |