Home | History | Annotate | Download | only in SemaObjC
      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