208 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -verify -Wno-objc-root-class %s
 | |
| 
 | |
| typedef long int NSUInteger;
 | |
| #define nil 0
 | |
| @class NSString;
 | |
| 
 | |
| @interface NSMutableArray
 | |
| 
 | |
| - (void)addObject:(id)object;
 | |
| - (void)insertObject:(id)object atIndex:(NSUInteger)index;
 | |
| - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)object;
 | |
| - (void)setObject:(id)object atIndexedSubscript:(NSUInteger)index;
 | |
| 
 | |
| @end
 | |
| 
 | |
| @interface NSMutableDictionary
 | |
| 
 | |
| - (void)setObject:(id)object forKey:(id)key;
 | |
| - (void)setObject:(id)object forKeyedSubscript:(id)key;
 | |
| - (void)setValue:(id)value forKey:(NSString *)key;
 | |
| 
 | |
| @end
 | |
| 
 | |
| @interface NSMutableSet
 | |
| 
 | |
| - (void)addObject:(id)object;
 | |
| 
 | |
| @end
 | |
| 
 | |
| @interface NSCountedSet : NSMutableSet
 | |
| 
 | |
| @end
 | |
| 
 | |
| @interface NSMutableOrderedSet
 | |
| 
 | |
| - (void)addObject:(id)object;
 | |
| - (void)insertObject:(id)object atIndex:(NSUInteger)index;
 | |
| - (void)setObject:(id)object atIndexedSubscript:(NSUInteger)index;
 | |
| - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)object;
 | |
| - (void)setObject:(id)object atIndex:(NSUInteger)index;
 | |
| 
 | |
| @end
 | |
| 
 | |
| @interface SelfRefClass
 | |
| {
 | |
|   NSMutableArray *_array; // expected-note {{'_array' declared here}}
 | |
|   NSMutableDictionary *_dictionary; // expected-note {{'_dictionary' declared here}}
 | |
|   NSMutableSet *_set; // expected-note {{'_set' declared here}}
 | |
|   NSCountedSet *_countedSet; // expected-note {{'_countedSet' declared here}}
 | |
|   NSMutableOrderedSet *_orderedSet; // expected-note {{'_orderedSet' declared here}}
 | |
| }
 | |
| @end
 | |
| 
 | |
| @implementation SelfRefClass
 | |
| 
 | |
| - (void)check {
 | |
|   [_array addObject:_array]; // expected-warning {{adding '_array' to '_array' might cause circular dependency in container}}
 | |
|   [_dictionary setObject:_dictionary forKey:@"key"]; // expected-warning {{adding '_dictionary' to '_dictionary' might cause circular dependency in container}}
 | |
|   [_set addObject:_set]; // expected-warning {{adding '_set' to '_set' might cause circular dependency in container}}
 | |
|   [_countedSet addObject:_countedSet]; // expected-warning {{adding '_countedSet' to '_countedSet' might cause circular dependency in container}}
 | |
|   [_orderedSet addObject:_orderedSet]; // expected-warning {{adding '_orderedSet' to '_orderedSet' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| - (void)checkNSMutableArray:(NSMutableArray *)a { // expected-note {{'a' declared here}}
 | |
|   [a addObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| - (void)checkNSMutableDictionary:(NSMutableDictionary *)d { // expected-note {{'d' declared here}}
 | |
|   [d setObject:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| - (void)checkNSMutableSet:(NSMutableSet *)s { // expected-note {{'s' declared here}}
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| - (void)checkNSCountedSet:(NSCountedSet *)s { // expected-note {{'s' declared here}}
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| - (void)checkNSMutableOrderedSet:(NSMutableOrderedSet *)s { // expected-note {{'s' declared here}}
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| @end
 | |
| 
 | |
| void checkNSMutableArrayParam(NSMutableArray *a) { // expected-note {{'a' declared here}}
 | |
|   [a addObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSMutableDictionaryParam(NSMutableDictionary *d) { // expected-note {{'d' declared here}}
 | |
|   [d setObject:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSMutableSetParam(NSMutableSet *s) { // expected-note {{'s' declared here}}
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSCountedSetParam(NSCountedSet *s) { // expected-note {{'s' declared here}}
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSMutableOrderedSetParam(NSMutableOrderedSet *s) { // expected-note {{'s' declared here}}
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSMutableArray() {
 | |
|   NSMutableArray *a = nil; // expected-note 5 {{'a' declared here}} 5
 | |
| 
 | |
|   [a addObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
|   [a insertObject:a atIndex:0]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
|   [a replaceObjectAtIndex:0 withObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
|   [a setObject:a atIndexedSubscript:0]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
|   a[0] = a; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSMutableDictionary() {
 | |
|   NSMutableDictionary *d = nil; // expected-note 4 {{'d' declared here}}
 | |
| 
 | |
|   [d setObject:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
|   [d setObject:d forKeyedSubscript:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
|   [d setValue:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
|   d[@"key"] = d; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSMutableSet() {
 | |
|   NSMutableSet *s = nil; // expected-note {{'s' declared here}}
 | |
| 
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSCountedSet() {
 | |
|   NSCountedSet *s = nil; // expected-note {{'s' declared here}}
 | |
| 
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void checkNSMutableOrderedSet() {
 | |
|   NSMutableOrderedSet *s = nil; // expected-note 5 {{'s' declared here}}
 | |
| 
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
|   [s insertObject:s atIndex:0]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
|   [s setObject:s atIndex:0]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
|   [s setObject:s atIndexedSubscript:0]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
|   [s replaceObjectAtIndex:0 withObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| // Test subclassing
 | |
| 
 | |
| @interface FootableSet : NSMutableSet
 | |
| @end
 | |
| 
 | |
| @implementation FootableSet
 | |
| - (void)meth {
 | |
|   [super addObject:self]; // expected-warning {{adding 'self' to 'super' might cause circular dependency in container}}
 | |
|   [super addObject:nil]; // no-warning
 | |
|   [self addObject:self]; // expected-warning {{adding 'self' to 'self' might cause circular dependency in container}}
 | |
| }
 | |
| @end
 | |
| 
 | |
| @interface FootableArray : NSMutableArray
 | |
| @end
 | |
| 
 | |
| @implementation FootableArray
 | |
| - (void)meth {
 | |
|   [super addObject:self]; // expected-warning {{adding 'self' to 'super' might cause circular dependency in container}}
 | |
|   [super addObject:nil]; // no-warning
 | |
|   [self addObject:self]; // expected-warning {{adding 'self' to 'self' might cause circular dependency in container}}
 | |
| }
 | |
| @end
 | |
| 
 | |
| @interface FootableDictionary : NSMutableDictionary
 | |
| @end
 | |
| 
 | |
| @implementation FootableDictionary
 | |
| - (void)meth {
 | |
|   [super setObject:self forKey:@"key"]; // expected-warning {{adding 'self' to 'super' might cause circular dependency in container}}
 | |
|   [super setObject:nil forKey:@"key"]; // no-warning
 | |
|   [self setObject:self forKey:@"key"]; // expected-warning {{adding 'self' to 'self' might cause circular dependency in container}}
 | |
| }
 | |
| @end
 | |
| 
 | |
| 
 | |
| void subclassingNSMutableArray() {
 | |
|   FootableArray *a = nil; // expected-note 5 {{'a' declared here}} 5
 | |
| 
 | |
|   [a addObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
|   [a insertObject:a atIndex:0]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
|   [a replaceObjectAtIndex:0 withObject:a]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
|   [a setObject:a atIndexedSubscript:0]; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
|   a[0] = a; // expected-warning {{adding 'a' to 'a' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void subclassingNSMutableDictionary() {
 | |
|   FootableDictionary *d = nil; // expected-note 4 {{'d' declared here}}
 | |
| 
 | |
|   [d setObject:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
|   [d setObject:d forKeyedSubscript:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
|   [d setValue:d forKey:@"key"]; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
|   d[@"key"] = d; // expected-warning {{adding 'd' to 'd' might cause circular dependency in container}}
 | |
| }
 | |
| 
 | |
| void subclassingNSMutableSet() {
 | |
|   FootableSet *s = nil; // expected-note {{'s' declared here}}
 | |
| 
 | |
|   [s addObject:s]; // expected-warning {{adding 's' to 's' might cause circular dependency in container}}
 | |
| }
 | |
| 
 |