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 6typedef signed char BOOL; 7#define nil ((void*) 0) 8 9typedef 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 92@interface I { 93 NSArray *ivarArr; 94} 95@end 96@implementation I 97-(void) foo { 98 NSString *str; 99 NSArray *arr; 100 NSDictionary *dict; 101 102 arr = @[]; 103 arr = @[str]; 104 arr = @[str, str]; 105 dict = @{}; 106 dict = @{str: arr}; 107 dict = @{@"key1": @"value1", @"key2": @"value2"}; 108 dict = [NSDictionary dictionaryWithObjectsAndKeys: PAIR(1), PAIR(2), nil]; 109 dict = [NSDictionary dictionaryWithObjectsAndKeys: 110 @"value1", @"key1", 111#ifdef BLAH 112 @"value2", @"key2", 113#else 114 @"value3", @"key3", 115#endif 116 nil ]; 117 118 id o = arr[2]; 119 o = dict[@"key"]; 120 o = TWO(dict[@"key"]); 121 o = @{@"key": @{}}; 122 NSMutableArray *marr = 0; 123 NSMutableDictionary *mdict = 0; 124 marr[2] = @"val"; 125 mdict[@"key"] = @"value"; 126 marr[2] = arr[4]; 127 mdict[@"key"] = dict[@"key2"]; 128 [mdict setObject:dict[@"key2"] forKey: 129#if 1 130 @"key1" 131#else 132 @"key2" 133#endif 134 ]; 135 mdict[@"key"] = [dict objectForKey: 136#if 2 137 @"key3" 138#else 139 @"key4" 140#endif 141 ]; 142 mdict[[dict objectForKey: 143#if 3 144 @"key5" 145#else 146 @"key6" 147#endif 148 ]] = @"value"; 149 mdict[dict[@"key2"]] = @"val"; 150 mdict[dict[@[@"arrkey"]]] = dict[@"key1"]; 151 __strong NSArray **parr = 0; 152 o = (*parr)[2]; 153 void *hd; 154 o = ((NSArray*)hd)[2]; 155 o = ivarArr[2]; 156 157 dict = @{@"A": @"1", arr[2]: @[]}; 158 dict = [NSDictionary dictionaryWithObjects:@[@"1", @"2"] forKeys:arr]; 159 dict = @{@"A": @"1", @"B": @"2"}; 160} 161@end 162 163extern const CFStringRef globStr; 164 165void test1(NSString *str) { 166 NSDictionary *dict = @{(id)globStr: str}; 167 dict = @{str: (id)globStr}; 168 dict = @{(id)globStr: str}; 169 dict = @{str: (id)globStr}; 170 171 NSArray *arr = @[(id)globStr, (id)globStr]; 172 arr = @[str, (id)globStr]; 173 arr = @[(id)globStr, str]; 174 arr = @[(id)globStr]; 175} 176 177@interface Custom : NSObject 178- (id)objectAtIndex:(unsigned long)index; 179@end 180 181@interface Custom (Extended) 182- (id)objectAtIndexedSubscript:(unsigned)idx; 183@end 184 185@interface MutableCustom : Custom 186- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject; 187@end 188 189@interface MutableCustom (Extended) 190- (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx; 191@end 192 193@interface CustomUnavail : NSObject 194- (id)objectAtIndex:(unsigned long)index; 195@end 196 197@interface CustomUnavail (Extended) 198- (id)objectAtIndexedSubscript:(unsigned)idx __attribute__((unavailable)); 199@end 200 201@interface MutableCustomUnavail : CustomUnavail 202- (void)replaceObjectAtIndex:(unsigned long)index withObject:(id)anObject; 203@end 204 205@interface MutableCustomUnavail (Extended) 206- (void)setObject:(id)obj atIndexedSubscript:(unsigned)idx __attribute__((unavailable)); 207@end 208 209void test2() { 210 MutableCustom *mutc; 211 id o = mutc[4]; 212 mutc[2] = @"val"; 213 214 MutableCustomUnavail *mutcunaval; 215 o = [mutcunaval objectAtIndex:4]; 216 [mutcunaval replaceObjectAtIndex:2 withObject:@"val"]; 217} 218 219@interface NSLocale : NSObject 220+ (id)systemLocale; 221+ (id)currentLocale; 222- (id)objectForKey:(id)key; 223@end 224 225void test3(id key) { 226 id o = [[NSLocale currentLocale] objectForKey:key]; 227} 228