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