1 | // RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-darwin -o - %s | FileCheck %s |
2 | |
3 | typedef unsigned int size_t; |
4 | @protocol P @end |
5 | |
6 | @interface NSMutableArray |
7 | - (id)objectAtIndexedSubscript:(size_t)index; |
8 | - (void)setObject:(id)object atIndexedSubscript:(size_t)index; |
9 | @end |
10 | |
11 | struct S { |
12 | operator unsigned int (); |
13 | operator id (); |
14 | }; |
15 | |
16 | @interface NSMutableDictionary |
17 | - (id)objectForKeyedSubscript:(id)key; |
18 | - (void)setObject:(id)object forKeyedSubscript:(id)key; |
19 | @end |
20 | |
21 | int main() { |
22 | NSMutableArray<P> * array; |
23 | S s; |
24 | id oldObject = array[(int)s]; |
25 | |
26 | NSMutableDictionary<P> *dict; |
27 | dict[(id)s] = oldObject; |
28 | oldObject = dict[(id)s]; |
29 | |
30 | } |
31 | |
32 | template <class T> void test2(NSMutableArray *a) { |
33 | a[10] = 0; |
34 | } |
35 | template void test2<int>(NSMutableArray*); |
36 | // CHECK-LABEL: define weak_odr void @_Z5test2IiEvP14NSMutableArray |
37 | // CHECK: @objc_msgSend |
38 | // CHECK: ret void |
39 | |
40 | |
41 | template <class T> void test3(NSMutableArray *a) { |
42 | a[sizeof(T)] = 0; |
43 | } |
44 | |
45 | template void test3<int>(NSMutableArray*); |
46 | // CHECK-LABEL: define weak_odr void @_Z5test3IiEvP14NSMutableArray |
47 | // CHECK: @objc_msgSend |
48 | // CHECK: ret void |
49 | |
50 | // CHECK-LABEL: define void @_Z11static_dataP14NSMutableArray |
51 | void static_data(NSMutableArray *array) { |
52 | // CHECK: call i32 @__cxa_guard_acquire |
53 | // CHECK: {{call i8*.*@objc_msgSend }} |
54 | // CHECK: call void @__cxa_guard_release |
55 | static id x = array[4]; |
56 | // CHECK: ret void |
57 | } |
58 | |