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 | |