1// RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-darwin -o - %s | FileCheck %s
2
3typedef 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
11struct 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
21int 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
32template <class T> void test2(NSMutableArray *a) {
33  a[10] = 0;
34}
35template void test2<int>(NSMutableArray*);
36// CHECK-LABEL: define weak_odr void @_Z5test2IiEvP14NSMutableArray
37// CHECK: @objc_msgSend
38// CHECK: ret void
39
40
41template <class T> void test3(NSMutableArray *a) {
42  a[sizeof(T)] = 0;
43}
44
45template 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
51void 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