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