1 // RUN: rm -rf %t 2 // RUN: %clang_cc1 -objcmt-migrate-literals -objcmt-migrate-subscripting -mt-migrate-directory %t %s -x objective-c -triple x86_64-apple-darwin11 3 // RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result 4 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -x objective-c %s.result 5 6 typedef signed char BOOL; 7 #define nil ((void*) 0) 8 9 typedef const struct __CFString * CFStringRef; 10 11 @interface NSObject 12 + (id)alloc; 13 @end 14 15 @protocol NSCopying 16 @end 17 18 @interface NSString : NSObject 19 + (id)stringWithString:(NSString *)string; 20 - (id)initWithString:(NSString *)aString; 21 @end 22 23 @interface NSArray : NSObject 24 - (id)objectAtIndex:(unsigned long)index; 25 @end 26 27 @interface NSArray (NSExtendedArray) 28 - (id)objectAtIndexedSubscript:(unsigned)idx; 29 @end 30 31 @interface NSArray (NSArrayCreation) 32 + (id)array; 33 + (id)arrayWithObject:(id)anObject; 34 + (id)arrayWithObjects:(const id [])objects count:(unsigned long)cnt; 35 + (id)arrayWithObjects:(id)firstObj, ...; 36 + (id)arrayWithArray:(NSArray *)array; 37 38 - (id)initWithObjects:(const id [])objects count:(unsigned long)cnt; 39 - (id)initWithObjects:(id)firstObj, ...; 40 - (id)initWithArray:(NSArray *)array; 41 @end 42 43 @interface NSMutableArray : NSArray 44 - (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject; 45 @end 46 47 @interface NSMutableArray (NSExtendedMutableArray) 48 - (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx; 49 @end 50 51 @interface NSDictionary : NSObject 52 - (id)objectForKey:(id)aKey; 53 @end 54 55 @interface NSDictionary (NSExtendedDictionary) 56 - (id)objectForKeyedSubscript:(id)key; 57 @end 58 59 @interface NSDictionary (NSDictionaryCreation) 60 + (id)dictionary; 61 + (id)dictionaryWithObject:(id)object forKey:(id)key; 62 + (id)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt; 63 + (id)dictionaryWithObjectsAndKeys:(id)firstObject, ...; 64 + (id)dictionaryWithDictionary:(NSDictionary *)dict; 65 + (id)dictionaryWithObjects:(NSArray *)objects forKeys:(NSArray *)keys; 66 67 - (id)initWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt; 68 - (id)initWithObjectsAndKeys:(id)firstObject, ...; 69 - (id)initWithDictionary:(NSDictionary *)otherDictionary; 70 - (id)initWithObjects:(NSArray *)objects forKeys:(NSArray *)keys; 71 @end 72 73 @interface NSMutableDictionary : NSDictionary 74 - (void)setObject:(id)anObject forKey:(id)aKey; 75 @end 76 77 @interface NSMutableDictionary (NSExtendedMutableDictionary) 78 - (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; 79 @end 80 81 @interface NSNumber : NSObject 82 @end 83 84 @interface NSNumber (NSNumberCreation) 85 + (NSNumber *)numberWithInt:(int)value; 86 @end 87 88 #define M(x) (x) 89 #define PAIR(x) @#x, [NSNumber numberWithInt:(x)] 90 #define TWO(x) ((x), (x)) 91 #define TWO_SEP(x,y) ((x), (y)) 92 93 @interface I { 94 NSArray *ivarArr; 95 } 96 @end 97 @implementation I 98 -(void) foo { 99 NSString *str; 100 NSArray *arr; 101 NSDictionary *dict; 102 103 arr = @[]; 104 arr = @[str]; 105 arr = @[str, str]; 106 dict = @{}; 107 dict = @{str: arr}; 108 dict = @{@"key1": @"value1", @"key2": @"value2"}; 109 dict = [NSDictionary dictionaryWithObjectsAndKeys: PAIR(1), PAIR(2), nil]; 110 dict = [NSDictionary dictionaryWithObjectsAndKeys: 111 @"value1", @"key1", 112 #ifdef BLAH 113 @"value2", @"key2", 114 #else 115 @"value3", @"key3", 116 #endif 117 nil ]; 118 119 id o = arr[2]; 120 o = dict[@"key"]; 121 o = TWO(dict[@"key"]); 122 o = TWO_SEP(dict[@"key"], arr[2]); 123 o = @{@"key": @{}}; 124 NSMutableArray *marr = 0; 125 NSMutableDictionary *mdict = 0; 126 marr[2] = @"val"; 127 mdict[@"key"] = @"value"; 128 marr[2] = arr[4]; 129 mdict[@"key"] = dict[@"key2"]; 130 [mdict setObject:dict[@"key2"] forKey: 131 #if 1 132 @"key1" 133 #else 134 @"key2" 135 #endif 136 ]; 137 mdict[@"key"] = [dict objectForKey: 138 #if 2 139 @"key3" 140 #else 141 @"key4" 142 #endif 143 ]; 144 mdict[[dict objectForKey: 145 #if 3 146 @"key5" 147 #else 148 @"key6" 149 #endif 150 ]] = @"value"; 151 mdict[dict[@"key2"]] = @"val"; 152 mdict[dict[@[@"arrkey"]]] = dict[@"key1"]; 153 __strong NSArray **parr = 0; 154 o = (*parr)[2]; 155 void *hd; 156 o = ((NSArray*)hd)[2]; 157 o = ivarArr[2]; 158 159 dict = @{@"A": @"1", arr[2]: @[]}; 160 dict = [NSDictionary dictionaryWithObjects:@[@"1", @"2"] forKeys:arr]; 161 dict = @{@"A": @"1", @"B": @"2"}; 162 dict = @{@"A": @[], @"B": @[]}; 163 } 164 @end 165 166 extern const CFStringRef globStr; 167 168 void test1(NSString *str) { 169 NSDictionary *dict = @{(id)globStr: str}; 170 dict = @{str: (id)globStr}; 171 dict = @{(id)globStr: str}; 172 dict = @{str: (id)globStr}; 173 174 NSArray *arr = @[(id)globStr, (id)globStr]; 175 arr = @[str, (id)globStr]; 176 arr = @[(id)globStr, str]; 177 arr = @[(id)globStr]; 178 } 179 180 @interface Custom : NSObject 181 - (id)objectAtIndex:(unsigned long)index; 182 @end 183 184 @interface Custom (Extended) 185 - (id)objectAtIndexedSubscript:(unsigned)idx; 186 @end 187 188 @interface MutableCustom : Custom 189 - (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject; 190 @end 191 192 @interface MutableCustom (Extended) 193 - (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx; 194 @end 195 196 @interface CustomUnavail : NSObject 197 - (id)objectAtIndex:(unsigned long)index; 198 @end 199 200 @interface CustomUnavail (Extended) 201 - (id)objectAtIndexedSubscript:(unsigned)idx __attribute__((unavailable)); 202 @end 203 204 @interface MutableCustomUnavail : CustomUnavail 205 - (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject; 206 @end 207 208 @interface MutableCustomUnavail (Extended) 209 - (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx __attribute__((unavailable)); 210 @end 211 212 void test2() { 213 MutableCustom *mutc; 214 id o = mutc[4]; 215 mutc[2] = @"val"; 216 217 MutableCustomUnavail *mutcunaval; 218 o = [mutcunaval objectAtIndex:4]; 219 [mutcunaval replaceObjectAtIndex:2 withObject:@"val"]; 220 } 221 222 @interface NSLocale : NSObject 223 + (id)systemLocale; 224 + (id)currentLocale; 225 - (id)objectForKey:(id)key; 226 @end 227 228 void test3(id key) { 229 id o = [[NSLocale currentLocale] objectForKey:key]; 230 } 231