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